GDB:在转储的整个内存中查找值

问题描述 投票:0回答:2

我有一个进程核心转储,类似于

// 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 coredump
2个回答
1
投票

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

然后从 gdb 中,您可以使用监视命令

(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

了解更多信息。


1
投票

您应该考虑使用 valgrind 或一些 address sanitizer (例如使用

-fsanitize=address
instrumentation optionGCC 进行编译)。这可能是帮助查找错误的最简单方法(假设您的错误是可重现的)。

关于你原来的问题,最近的GDBPython中是可扩展(也许在Guile)。您可以根据您的需要编写脚本。

您还可以在智能指针或指向对象的

use_count
字段上放置一个观察点(您可能需要禁用 ASLR 以简化调试)。

© www.soinside.com 2019 - 2024. All rights reserved.