GDB和核心转储的麻烦

Han*_*lla 6 c linux gdb core

认识我的

$ uname -a
Linux hostmachine 4.1.2-2-ARCH #1 SMP PREEMPT Wed Jul 15 08:30:32 UTC 2015 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我正在尝试学习如何使用GDB来调试C程序.我认为如果我可以使用GDB找出导致段错误的错误,那将是特别优秀的.我有一个小程序,我作为K&R练习1-13的解决方案编写,给定一个特定大小的输入字符串,它将生成一个段错误:

$ ~/learning_c/KR_exercises/chapter_1/1.13.x`
Run Code Online (Sandbox Code Playgroud)

- 我提供了stdin的字符串,并且......--

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

根据Arch wiki的说法,"Systemd的默认行为是为所有进程生成核心转储/var/lib/systemd/coredump/."

Okie doke:

$ls /var/lib/systemd/coredump/core.1\x2e13\x2ex.1000.0da6be3a2b4647c8befe14e0e73af848.1719.1438627150000000.lz4
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时:

$ gdb -q ~/learning_c/KR_exercises/chapter_1/1.13.x /var/lib/systemd/coredump/core.1\\x2e13\\x2ex.1000.0da6be3a2b4647c8befe14e0e73af848.1719.1438627150000000.lz4
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

试图通过在GDB连接过程中生成核心转储为这里详述不仅使我的终端仿真器开始捕获控制字符(^D,^C以及^Z将在仿真器连接后GDB无法正常工作),如果段错误是否附着GDB后存在的它不是在shell中报告.

帮助我理解,堆栈溢出的仁慈和仁慈的领主!

附录:

我已经解决了这个特殊问题,主要归功于WhozCraig,他建议GDB在强制馈送lz4压缩核心文件时表现得如此.如果克雷格会如此善良地发布一个类似的解决方案的解决方案,我会很乐意给他那个大的复选标记.

最简单的解决方案是通过一个以coredumpctl崩溃程序的PID 命名的子程序启动gdb ,a la

$coredumpctl gdb *PID HERE*

这让我很烦恼,Arch,我可能会因此而迁移到Gentoo.

Spa*_*222 8

我和你有同样的目的。只需通过lz4命令解压lz4文件,然后就可以调试了gdb crashed_C_executable_file uncompressed_coredump_file

  • 如果您使用 coredumpctl gdb,则不需要解压缩或重新压缩它。 (3认同)

Han*_*lla 5

我已经解决了这个特殊的问题,这在很大程度上要感谢WhozCraig,他建议GDB在强制提供LZ4压缩核心文件时应有的表现。如果克雷格(Craig)愿意发布类似的解决方案,我很乐意给他这么大的ol复选标记,尽管我功不可没。哇!

最简单的解决方案是通过名为coredumpctl的子例程以及崩溃的程序的PID来启动gdb。

$ coredumpctl gdb PID HERE

这vexes我,拱,我可能迁移到Gentoo的缘故吧

  • 最简单的方法是通过coredumpctl gdb -1调试最新的转储。 (5认同)