GDB:在转储的整个内存中查找值
GDB: find value in whole memory of dump
我在
这样的行上有一个进程核心转储
// ptr is boost::shared_ptr<Whatever>
assert(ptr.unique())
即有两个 shared_ptr
引用同一个对象,但程序 逻辑上 需要独占所有权。这是逻辑问题,不是内存损坏。
使用 gdb 我可以看到指针的地址(例如 0x001234567890),包含在 ptr
中并验证它是 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
显示有关内存区域的信息,但它不适用于核心转储。
是否有其他方法可以找到此 address/value 的存储位置?
您应该考虑使用 valgrind or some address sanitizer (e.g. compile with -fsanitize=address
instrumentation option to GCC)。这可能是帮助找到您的错误的最简单方法(假设您的错误是可重现的)。
关于你原来的问题,最近 GDB are extendable in Python (and perhaps in Guile)。您可以根据需要编写脚本。
您还可以在智能指针或指向对象的 use_count
字段上放置一个观察点(您可能需要禁用 ASLR 以简化调试)。
要找到指向一块内存的指针,可以使用
valgrind 和 gdb 在一起。
然后在gdb中,可以使用monitor命令
(gdb) monitor who_points_at <addr> [<len>]
找到这些指针在哪里。
所以,如果你对一段内存有 2 个引用,who_points_at
应该可以 return 他们。
请注意 who_points_at 正在搜索任何 'word aligned' 数据
指向范围 [addr, addr + len(
因此,您可能会发现更多事件,例如一个整数可能 'look' 像
它指向这段记忆。
见http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver
和
http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands
了解更多信息。
我在
这样的行上有一个进程核心转储// ptr is boost::shared_ptr<Whatever>
assert(ptr.unique())
即有两个 shared_ptr
引用同一个对象,但程序 逻辑上 需要独占所有权。这是逻辑问题,不是内存损坏。
使用 gdb 我可以看到指针的地址(例如 0x001234567890),包含在 ptr
中并验证它是 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
显示有关内存区域的信息,但它不适用于核心转储。
是否有其他方法可以找到此 address/value 的存储位置?
您应该考虑使用 valgrind or some address sanitizer (e.g. compile with -fsanitize=address
instrumentation option to GCC)。这可能是帮助找到您的错误的最简单方法(假设您的错误是可重现的)。
关于你原来的问题,最近 GDB are extendable in Python (and perhaps in Guile)。您可以根据需要编写脚本。
您还可以在智能指针或指向对象的 use_count
字段上放置一个观察点(您可能需要禁用 ASLR 以简化调试)。
要找到指向一块内存的指针,可以使用 valgrind 和 gdb 在一起。
然后在gdb中,可以使用monitor命令
(gdb) monitor who_points_at <addr> [<len>]
找到这些指针在哪里。
所以,如果你对一段内存有 2 个引用,who_points_at 应该可以 return 他们。
请注意 who_points_at 正在搜索任何 'word aligned' 数据 指向范围 [addr, addr + len( 因此,您可能会发现更多事件,例如一个整数可能 'look' 像 它指向这段记忆。
见http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver 和 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands
了解更多信息。