【问题标题】:GDB: find value in whole memory of dumpGDB:在转储的整个内存中查找值
【发布时间】:2018-01-10 15:22:25
【问题描述】:

我在一行上有一个进程核心转储

// ptr is boost::shared_ptr<Whatever>
assert(ptr.unique())

即有两个shared_ptr 引用同一个对象,但程序逻辑上 期望独占所有权。这是逻辑问题,不是内存损坏。

使用 gdb,我可以看到 ptr 中包含的指针地址(例如 0x001234567890),并验证它是 use_count == 2

在类似的东西上使用 hexdump 我可以很容易地找到其他事件:

$ xxd core2 | fgrep '9078 5634 1200'
114e3e1e0109c 002c 307f 0000 9078 5634 1200 0000  ...
15b8b2ba000d7 ffa2 307f 0000 9078 5634 1200 0000  ...
1618b644000e7 7fa3 307f 0000 9078 5634 1200 0000  ...

gdb 中有一个命令find 可以在指定区域中搜索指定值,但它需要正确分配的内存区域。

有一个命令info mem 显示有关内存区域的信息,但它不适用于核心转储。

还有其他方法可以找到这个地址/值的存储位置吗?

【问题讨论】:

    标签: c++ linux gdb core


    【解决方案1】:

    要找到指向一块内存的指针,你可以使用 valgrind 和 gdb 一起使用。

    然后从gdb,就可以使用monitor命令了

    (gdb)  monitor who_points_at <addr> [<len>]
    

    找到这些指针在哪里。

    所以,如果你有 2 次对一段内存的引用,who_points_at 应该可以退货。

    请注意 who_points_at 正在搜索任何“字对齐”数据 指向范围 [addr, addr + len( 因此,您可能会发现更多的事件,例如一个整数可能“看起来”像 它指向这段记忆。

    http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserverhttp://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands

    了解更多信息。

    【讨论】:

    • 在调试核心转储时不是真正的解决方案。没有什么可以监控的。 "monitor" command not supported by this target.
    【解决方案2】:

    您应该考虑使用valgrind 或一些address sanitizer(例如,使用-fsanitize=address 编译instrumentation optionGCC)。这可能是帮助您找到错误的最简单方法(假设您的错误是可重现的)。

    关于您最初的问题,最近的GDBextendablePython 中(也许在Guile 中)。您可以根据需要编写脚本。

    您还可以在智能指针或指向对象的use_count 字段上放置一个观察点(您可能需要禁用ASLR 以简化调试)。

    【讨论】:

    • 抱歉误导,但这不是内存问题。似乎 GDB 为普通 GDB 中可用的 python 提供的一切,所以这不是一个答案。 Watchpoint 可以解决问题,但是运行时动态创建的指针很多,很少出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多