2012-08-22 53 views
11

在GDB調試C++代碼中:我有15個斷點戰略設置,但我不希望它們中的任何一個在我打到第2個斷點前激活。 GDB中是否有任何運行中斷點 - n命令?GDB:運行到特定斷點

我覺得自己做的兩件事情,而不是一個:

  1. 刪除所有其他斷點,這樣#2是所有存在,運行,重新添加所有的斷點;或

  2. 運行並重復運行continue過去的所有休息時間,直到我在#2看到第一次休息。

我想是這樣run-until 2將忽略除#2的所有其它的斷點,但不能刪除它們。這是否存在?其他人是否有更好的方法來處理這個問題?

回答

11

隨着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 
+0

太棒了,這是非常有用的(和hackable)。謝謝alex! – sligocki

+0

這太好了。 「繼續直到」版本可能會更有用。 –

3

比刪除所有其他斷點稍微痛苦一點就是disable他們。這樣你就不必重新輸入所有與斷點相關的東西來把它帶回來,只需要再次按數字鍵入enable

2

隨着gdb斷點可以被禁用,而不是刪除。然後,您需要做的就是在需要時重新啓用它們。

11

您可以將enabledisable斷點,並且這些命令將接受範圍。在程序執行過程中的關鍵點,使用這些命令和範圍。

我認爲當你提到斷點#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 
+0

感謝pb2q,我不知道有關啓用和禁用。 – sligocki

+0

只需「禁用」即可禁用所有斷點。 –