这是在Ubuntu 12.04,GDB版本GNU gdb(Ubuntu / Linaro 7.4-2012.04-0ubuntu2.1)7.4-2012.04
我工作的应用程序,比我关心的更多次转储核心。当我按照以下方式启动gdb时,我没有得到任何可用的回溯。
gdb --core <path to core dump>
GDB确实显示了导致核心转储以及命令行参数的完整进程路径。
在gdb提示符下,如果我执行命令
file <path to executable>
core-file <path to core dump>
我确实可以回溯。
从gdb提示符执行的--core命令行选项和core-file命令之间有什么区别。
无论如何我可以在命令行中执行此操作。毕竟,gdb确实知道可执行文件和核心文件名的路径。
答案 0 :(得分:3)
无论如何,我可以在命令行中执行此操作。
是:gdb /path/to/exe /path/to/core
我的主要兴趣是为什么gdb表现不同。
它没有。
为了节省磁盘空间,大多数UNIX系统不会将文件支持的只读页面(例如程序代码)转储到核心文件中 - 该代码已经在磁盘上了,那么为什么要再次编写它? (这实际上是可配置的:请参阅man core
和coredump_filter
)。
但是这些只读页面包含符号(您在nm
和backtrace
输出中看到的内容),所以如果您不告诉GDB可执行文件在哪里,那么它可以& #39; t产生有意义的backtrace
。
毕竟,gdb确实知道可执行文件的路径
不,它没有。
内核记录有关生成核心的可执行文件的不完整信息。该信息不可靠:
./a.out
并且绝对无法保证当前目录在GDB分析时与调用可执行文件时的目录相同,并且elf_prpsinfo.pr_fname[]
中只有16个字符的空格,任何比这更长的字符都会被截断。