【问题标题】:How to search in modern linux core dumps with c/c++?如何使用 c/c++ 在现代 linux 核心转储中搜索?
【发布时间】:2012-05-15 16:32:14
【问题描述】:

我有一个程序,它的结构定义如下:

struct foo {
    int magic;
    int bar;
};

当我创建这个结构的对象时,我总是做以下事情:

object.magic = 654321;

这个程序最终会随着核心转储而死。

是否有可能让 c++ 程序自动计数所有的 bar 值并例如求和?

PS。到目前为止,我已经调查过我不能简单地将核心作为二进制打开并搜索 654321 转换为十六进制(在十六进制编辑器中找不到)。 Wikipedia 说现代 unix 系统使用 ELF,但不幸的是我不了解所有标头系统,因为我是一个非常缺乏经验的程序员。

有没有办法在不学习整个标题结构的情况下获得这个栏?

【问题讨论】:

  • 如果您输入幻数0x654321,您可以在二进制文件中搜索字符串“eC!”或“!Ce”,取决于字节序。
  • 确保对象在堆上。如果在堆栈上,编译器可能已经优化掉了这个值。还要检查您的核心文件的大小是否不受限制,也许它只是被截断了。

标签: c++ c coredump


【解决方案1】:

到目前为止,我已经调查过,我不能简单地将核心作为二进制打开并搜索 654321 转换为十六进制(在十六进制编辑器中找不到)。

我希望这会产生一些匹配。确保您在搜索时得到了正确的 endianness

注意无论您使用什么方法来做到这一点,它都必然是一个近似值。你不能指望这样的搜索总是找到foo 的所有实例而没有其他任何东西(尤其是在导致进程崩溃的事件之后)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多