认识我的
$ uname -a
Linux hostmachine 4.1.2-2-ARCH #1 SMP PREEMPT Wed Jul 15 08:30:32 UTC 2015 x86_64 GNU/Linux
我正在尝试学习如何使用 GDB 调试 C 程序。我认为,如果我可以使用 GDB 找出导致段错误的错误,那将特别出色。我有一个小程序,作为 K&R 练习 1-13 的解决方案而编写,给定一个特定大小的输入字符串,它将生成一个段错误:
$ ~/learning_c/KR_exercises/chapter_1/1.13.x`
--我提供了一个来自标准输入的字符串,并且...--
Segmentation fault (core dumped)
根据Arch wiki , "Systemd 的默认行为是为 /var/lib/systemd/coredump/
中的所有进程生成核心转储。"
奥基杜克:
$ls /var/lib/systemd/coredump/core.1\x2e13\x2ex.1000.0da6be3a2b4647c8befe14e0e73af848.1719.1438627150000000.lz4
但是当我运行时:
$ gdb -q ~/learning_c/KR_exercises/chapter_1/1.13.x /var/lib/systemd/coredump/core.1\\x2e13\\x2ex.1000.0da6be3a2b4647c8befe14e0e73af848.1719.1438627150000000.lz4
我得到:
Reading symbols from /home/dean/learning_c/KR_exercises/chapter_1/1.13.x...done.
"/var/lib/systemd/coredump/core.1\x2e13\x2ex.1000.0da6be3a2b4647c8befe14e0e73af848.1719.1438627150000000.lz4" is not a core dump: File format not recognized
尝试通过将 GDB 附加到进程来生成核心转储 as detailed here只让我的终端模拟器开始捕获控制字符(^D
、^C
和 ^Z
在附加 GDB 后将无法在模拟器中工作) ,并且如果在附加 GDB 后发生段错误,则不会在 shell 中报告它。
帮助我理解,哦,Stack Overflow 仁慈仁慈的领主们!
附录:
我已经解决了这个特殊问题,这在很大程度上要感谢 WhozCraig,他建议 GDB 在被强制输入 lz4 压缩核心文件时表现得像它应该表现的那样。如果克雷格好心地发布一个解决方案,说类似的话,我很乐意给他那个大大的“ol”复选标记。
最简单的解决方案是通过名为 coredumpctl
的子程序以及崩溃程序的 PID 来启动 gdb,a la
$coredumpctl gdb *PID HERE*
这让我很烦恼,Arch,我可能会因此迁移到 Gentoo。
最佳答案
我已经解决了这个特殊问题,这在很大程度上要感谢 WhozCraig,他建议 GDB 在被强制输入 LZ4 压缩核心文件时表现得像它应该表现的那样。 如果 Craig 愿意发布一个解决方案,说类似的话,我会很乐意给他那个大大的“ol”复选标记 不过,我会把所有的功劳都归功于他。哇哈哈哈!
最简单的solution是通过名为 coredumpctl 的子程序以及崩溃程序的 PID 启动 gdb,a la
$coredumpctl gdb PID 在这里
这让我很烦恼,Arch,我可能会因此迁移到 Gentoo。
关于c - GDB 和核心转储问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31795901/