特定の構造体のさまざまなインスタンスを有効期間中に割り当てて解放する C プログラムをデバッグしようとしています。ある時点で、これらのインスタンスの 1 つが破損しています。
それをデバッグするには、これらの構造が割り当てられた直後にウォッチポイントを設定し、解放される直前にウォッチポイントを削除したいと思います。そのために、gdb.Breakpoint
:BreakpointAlloc()
とBreakpointFree()
. 前者stop()
には割り当てられた構造体にウォッチポイントを追加するメソッドがあり、後者にはstop()
ウォッチポイントを削除するメソッドがあります。(ウォッチポイントは、割り当てられたインスタンスのアドレスを含む文字列によってインデックス付けされた dict に保持されます。)
多数のインスタンスが割り当てられているため (100 以上)、ハードウェア ウォッチポイントを使用できません。ただし、ソフトウェア ウォッチポイントを (最初に を実行してgdb.execute("set can-use-hw-watchpoints 0")
) 使用すると、プログラムが動かなくなったように見え、何が起こっているのかわかりません。
#!/usr/bin/env python
import gdb
wps = {}
def BreakpointAlloc(gdb.Breakpoint):
def stop(self):
ptr = gdb.parse_and_eval("ptr").address
wp = gdb.Breakpoint("*({0})({1})".format(ptr.type, ptr), gdb.BP_WATCHPOINT)
wps["{0}".format(ptr)] = wp
return False
def BreakpointFree(gdb.Breakpoint):
def stop(self):
ptr = gdb.parse_and_eval("ptr").address
wp = wps["{0}".format(ptr)]
wp.delete()
del wps["{0}".format(wp)]
return False
bp_alloc = BreakpointAlloc("prog.c:111")
bp_free = BreakpointFree("prog.c:222")
gdb.execute("set can-use-hw-watchpoints 0")
gdb python API のドキュメントでは、私が行っていることを行うべきではないと示唆しています。プログラムがウェッジしている理由を説明できると思います:
関数: Breakpoint.stop ( self )
...
Inferior の実行状態 (つまり、step、next など) を変更したり、現在のフレーム コンテキストを変更したり (つまり、現在のアクティブ フレームを変更したり)、ブレークポイントを変更、追加、または削除したりしないでください。
ドキュメントを考慮して、停止イベントを介してウォッチポイントを追加/削除するようにプログラムを変更しようとしました(以下を参照)。ソフトウェア ウォッチポイントを使用すると、同じ問題が発生します。プログラムがウェッジしているように見えます。
#!/usr/bin/env python
import gdb
wps = {}
bp_alloc = gdb.Breakpoint("prog.c:111")
bp_free = gdb.Breakpoint("proc.c:222")
def stopAlloc():
ptr = gdb.parse_and_eval("ptr").address
wp = gdb.Breakpoint("*({0})({1})".format(ptr.type, ptr), gdb.BP_WATCHPOINT)
wps["{0}".format(ptr)] = wp
def stopFree():
ptr = gdb.parse_and_eval("ptr").address
wp = wps["{0}".format(ptr)]
wp.delete()
del wps["{0}".format(ptr)]
def handleStop(stopEvent):
for bp in stopEvent.breakpoints:
if bp == bp_alloc:
stopAlloc()
elif bp == bp_free:
stopFree()
gdb.events.stop(handleStop)
gdb.execute("set can-use-hw-watchpoints 0")
ブレークポイントからウォッチポイントを操作する方法についてのアイデアはありますか?
(または、この問題をデバッグする方法に関する他のアイデアはありますか?)