gpt4 book ai didi

c - 为什么 gdb 不能在没有二进制文件的情况下显示非符号堆栈跟踪?

转载 作者:行者123 更新时间:2023-12-02 00:11:46 49 4
gpt4 key购买 nike

只是好奇:当我在 gdb 中加载一个核心文件时,回溯看起来像这样:

...

Thread 2 (Thread 1109):
#0 0x2b03d968 in ?? ()

Thread 1 (Thread 23490):
#0 0x2b0c3624 in ?? ()
(gdb)

但是在我使用"file"加载二进制文件后,我得到了这个:

...

#0 __pthread_cond_wait (cond=0x46b810, mutex=0x46b7f0) at pthread_cond_wait.c:156
#1 0x004076a8 in main (argc=1, argv=0x7fa66784) at idpoint.c:258
...

#0 0x2b0c3624 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
#1 0x2b0c8464 in *__GI_abort () at abort.c:88
#2 0x2b0faeec in __libc_message (do_abort=2, fmt=0x2b1d0840 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:173
#3 0x2b107e3c in malloc_printerr (action=3, str=0x2b1d0930 "free(): invalid next size (fast)", ptr=<value optimized out>) at malloc.c:5994
...

问题:为什么 gdb 甚至不尝试在加载符号之前显示调用堆栈?我的猜测是它不知道段在内存中的位置,也不知道将哪些堆栈数据解释为数据与地址?这是正确的吗?

如果能够获得 gdb 的最佳尝试,那就太好了:在不使用符号的情况下显示调用堆栈的最佳尝试,以了解堆栈深度,或供以后解释...

最佳答案

因为二进制文件包含允许调试器了解的符号信息(调试符号),例如,每个函数的堆栈帧有多大 [在函数中的任何给定时间!]。这些信息在代码启动时并没有加载到内存中,所以它不可能在core文件中。

您当然可以使用 x/200 $esp(或者调用堆栈指针的任何名称 - 我猜是 x86 - 如果它是 ARM,则称为 $R15 从内存中)。不幸的是,如果无法访问这些符号,gdb 将无法真正了解堆栈中的内容,并且只能提供堆栈的原始转储 - 在大多数情况下是甚至比不显示任何东西都没有帮助,因为显示大量随机数据(并且大部分堆栈将是 - 特别是如果关闭帧指针 - 使用帧指针你有一些机会取消嵌套堆栈)是最没用的的时间。

关于c - 为什么 gdb 不能在没有二进制文件的情况下显示非符号堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872533/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com