2017-08-03 89 views
1

的整個存儲值我有一個對準的處理核心轉儲像GDB:找到轉儲

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

也就是說有兩個shared_ptr引用同一個對象,但程序邏輯預計獨佔所有權。這是邏輯問題,而不是內存損壞。

使用gdb我可以看到指針的地址(例如0x0),包含在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 ... 

有一個命令find在gdb比可以搜索特定區域的規定值,但它需要更正分配的內存區域。

有一個命令info mem它顯示有關內存區域的信息,但它不適用於coredumps。

有沒有其他的方法可以找到這個地址/值的存儲位置?

回答

1

要找到指向一段內存的指針,可以將valgrind和gdb一起使用 。

然後從GDB,您可以使用顯示器命令

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

找到哪裏是這些指針。

所以,如果你有2個引用一段內存,who_points_at 應該能夠返回它們。

注意who_points_at正在尋找任何「字對齊」數據 指向的範圍[地址,地址+ 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=addressinstrumentation optionGCC編譯)。這可能是幫助您找到bug的最簡單方法(假設您的bug是可重現的)。

關於您的原始問題,最近GDBextendablePython(也許在Guile)。你可以爲你的需求編寫一個腳本。

您也可以在智能指針或尖頭物體的use_count字段上放置觀察點(您可能需要禁用ASLR以便於調試)。

+0

對不起,誤導,但它不是一個內存問題。 它看ms GDB提供的一切GDB提供的一切,因此它不是一個答案。 Watchpoint可以解決這個問題,但是在運行時有很多動態創建的指針,並且問題很少出現。 – MadRunner