linux - 核心和核心文件之间的区别

标签 linux ubuntu gdb core

这是在 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 corecoredump_filter)。

但是这些只读页面包含符号(您在 nmbacktrace 输出中看到的符号),因此如果您不告诉 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/

相关文章:

linux - 一个 SSH key 适用于多个 Ubuntu 服务器 + Windows + Teamcity

linux - 如何使用调试版的 libc

linux - 如何使用 shuf 命令生成随机 ipv4 地址?

linux - 在主机访问控制中配置后无法访问 WHM 和 SSH/root

linux - 如何使用用户和路径将后缀输入通过管道传递给特定脚本?

linux - 我们如何为同一台 Linux 机器上的所有用户安装 rustc、cargo?

c++ - 如何从二进制文件安装 memcached 并包含在 c 文件中

regex - 如何使用 sed 进行多种模式替换

gdb - gdb 的 rwatch 的 lldb 等价物是什么?

c - 组装指令解读