在GDB調試C++代碼中:我有15個斷點戰略設置,但我不希望它們中的任何一個在我打到第2個斷點前激活。 GDB中是否有任何運行中斷點 - n命令?GDB:運行到特定斷點
我覺得自己做的兩件事情,而不是一個:
刪除所有其他斷點,這樣#2是所有存在,運行,重新添加所有的斷點;或
運行並重復運行
continue
過去的所有休息時間,直到我在#2看到第一次休息。
我想是這樣run-until 2
將忽略除#2的所有其它的斷點,但不能刪除它們。這是否存在?其他人是否有更好的方法來處理這個問題?
在GDB調試C++代碼中:我有15個斷點戰略設置,但我不希望它們中的任何一個在我打到第2個斷點前激活。 GDB中是否有任何運行中斷點 - n命令?GDB:運行到特定斷點
我覺得自己做的兩件事情,而不是一個:
刪除所有其他斷點,這樣#2是所有存在,運行,重新添加所有的斷點;或
運行並重復運行continue
過去的所有休息時間,直到我在#2看到第一次休息。
我想是這樣run-until 2
將忽略除#2的所有其它的斷點,但不能刪除它們。這是否存在?其他人是否有更好的方法來處理這個問題?
隨着7.0版本GDB支持python腳本。我寫了一個簡單的腳本,它將臨時禁用除指定編號以外的所有已啓用斷點,並執行GDB run
命令。
下面的代碼添加到.gdbinit
文件:
python
import gdb
class RunUntilCommand(gdb.Command):
"""Run until breakpoint and temporary disable other ones"""
def __init__ (self):
super(RunUntilCommand, self).__init__ ("run-until",
gdb.COMMAND_BREAKPOINTS)
def invoke(self, bp_num, from_tty):
try:
bp_num = int(bp_num)
except (TypeError, ValueError):
print "Enter breakpoint number as argument."
return
all_breakpoints = gdb.breakpoints() or []
breakpoints = [b for b in all_breakpoints
if b.is_valid() and b.enabled and b.number != bp_num and
b.visible == gdb.BP_BREAKPOINT]
for b in breakpoints:
b.enabled = False
gdb.execute("run")
for b in breakpoints:
b.enabled = True
RunUntilCommand()
end
比刪除所有其他斷點稍微痛苦一點就是disable
他們。這樣你就不必重新輸入所有與斷點相關的東西來把它帶回來,只需要再次按數字鍵入enable
。
隨着gdb
斷點可以被禁用,而不是刪除。然後,您需要做的就是在需要時重新啓用它們。
您可以將enable
和disable
斷點,並且這些命令將接受範圍。在程序執行過程中的關鍵點,使用這些命令和範圍。
我認爲當你提到斷點#2你指的是斷點的gdb編號。下面是一個簡單的gdb會話示例:
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x00001ddb in main at example.c:34
2 breakpoint keep y 0x00001e00 in main at example.c:39
3 breakpoint keep y 0x00001e15 in main at example.c:40
(gdb) disable 1-3
(gdb) enable 2
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep n 0x00001ddb in main at example.c:34
2 breakpoint keep y 0x00001e00 in main at example.c:39
3 breakpoint keep n 0x00001e15 in main at example.c:40
(gdb)
現在只啓用斷點#2。運行程序,當執行處斷裂#2,重新啓用所有你想要的斷點,範圍:
(gdb) enable 1-3
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x00001ddb in main at example.c:34
2 breakpoint keep y 0x00001e00 in main at example.c:39
3 breakpoint keep y 0x00001e15 in main at example.c:40
你也可以混合斷點數量和範圍:
(gdb) disable 1 4 6-7
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep n 0x00001ddb in main at example.c:34
2 breakpoint keep y 0x00001e00 in main at example.c:39
3 breakpoint keep y 0x00001e15 in main at example.c:40
4 breakpoint keep n 0x00001e4f in main at example.c:43
5 breakpoint keep y 0x00001e4f in main at example.c:44
6 breakpoint keep n 0x00001e5e in main at example.c:45
7 breakpoint keep n 0x00001e5e in main at example.c:46
感謝pb2q,我不知道有關啓用和禁用。 – sligocki
只需「禁用」即可禁用所有斷點。 –
太棒了,這是非常有用的(和hackable)。謝謝alex! – sligocki
這太好了。 「繼續直到」版本可能會更有用。 –