这是在 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>
我确实得到了可用的回溯。
--core 命令行选项和从 gdb 提示符执行的 core-file 命令有什么区别。
我可以在命令行中执行此操作吗?毕竟,gdb 确实知道可执行文件的路径和核心文件名。
最佳答案
Is there anyway I can do this in command line.
是:gdb/path/to/exe/path/to/core
My main interest is why does gdb behaves differently.
事实并非如此。
大多数 UNIX 系统,为了节省磁盘空间,不会将文件支持的只读页面(例如程序代码)转储到核心文件中——该代码已经在磁盘上,那么为什么还要再次写入呢? (这实际上是可配置的:请参阅 man core
和 coredump_filter
)。
但是这些只读页面包含符号(您在 nm
和 backtrace
输出中看到的符号),因此如果您不告诉 GDB 可执行文件在哪里,那么它就无法产生有意义的回溯
。
After all, gdb does know the path to executable
不,事实并非如此。
内核记录有关生成内核的可执行文件的不完整信息。该信息不可靠:
- 它可以记录相对路径,例如
./a.out
并且绝对不能保证 GDB 分析时的当前目录与调用可执行文件时的目录相同,并且 elf_prpsinfo.pr_fname[]
中只能容纳 16 个字符,超过此长度的内容将被截断。
关于linux - 核心和核心文件之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180257/