2015-12-30 87 views
4

我希望當我的程序在gdb下執行時,
在執行任何代碼行之前,請檢查該行是否包含特定的單詞例如宏名稱或變量名稱或任何特定的單詞,如果有,則停止執行。
如果可以使用正則表達式完成則更好。在gdb中如何在任何有特定單詞的行上設置斷點?

我知道有一個命令rbreakrb但設置匹配函數名稱的斷點,這不是我想要的。

那麼有可能嗎?

回答

5

在gdb之外,你可以搜索你的源代碼並首先列出你的斷點,然後用-x標誌調用gdb來設置這些斷點。

計劃

  • 的grep在源爲用戶定義的模式(例如,擦除,刪除)
  • 生成基於上面的行號的break語句,寫入這些到文件
  • 用-x標誌調用gdb並指向產生的帶有break語句的文件

人GDB

... 
    -x file 
     Execute GDB commands from file file. 
    ... 

write_breakpoints.sh

#!/bin/bash 

sourcename="$1"; 
patterns="$2"; 
outbreaks="$3"; 

grep -En "$2" "$1" | \ 
    cut -d: -f1 | \ 
    sed "s/^\(.\+\)$/break $1:\1/g" 1>>"$3"; 

例子。ç

#include <stdio.h> 

void delete() 
{ 
    printf("!! data is being deleted..\n"); 
} 

void erase() 
{ 
    printf("!! data is being erased..\n"); 
} 

int main(void) 
{ 
    printf("this line is safe..\n"); 
    erase(); 
    delete(); 
    return 0; 
} 

使用

$ gcc -g example.c -o example 
$ ./write_breakpoints.sh example.c "(delete|erase)" "breakpoints.txt" 

$ gdb -x breakpoints.txt example 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 
Copyright (C) 2014 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from example...done. 
Breakpoint 1 at 0x400531: file example.c, line 3. 
Breakpoint 2 at 0x400531: file example.c, line 5. 
Breakpoint 3 at 0x400541: file example.c, line 8. 
Breakpoint 4 at 0x400541: file example.c, line 10. 
Breakpoint 5 at 0x40055b: file example.c, line 16. 
Breakpoint 6 at 0x400565: file example.c, line 17. 
(gdb) run 
Starting program: /path/to/example 
this line is safe.. 

Breakpoint 5, main() at example.c:16 
16 erase(); 
(gdb) c 
Continuing. 

Breakpoint 3, erase() at example.c:10 
10 printf("!! data is being erased..\n"); 
(gdb) c 
Continuing. 
!! data is being erased.. 

Breakpoint 6, main() at example.c:17 
17 delete(); 
(gdb) c 
Continuing. 

Breakpoint 1, delete() at example.c:5 
5  printf("!! data is being deleted..\n"); 
(gdb) c 
Continuing. 
!! data is being deleted.. 
[Inferior 1 (process 26130) exited normally] 
(gdb) quit 

筆記

  • 可以調用與多個源文件write_breakpoints(因爲它追加break語句)
  • 它也有可能基於@ amdixon的回答
0

是否有可能?

GDB不你的源所有。它只是在特定的位置插入斷點,然後全速運行程序,直到遇到其中一個斷點。

你要求的是GDB反覆執行next命令,然後有條件地繼續,如果你所在的行不符合你的正則表達式。我不確定是否可以對此進行編寫,但即使是這樣,對於任何非平凡的程序,這將是不切實際的緩慢

0

做使用forward-search和B這和GDB裏,我寫了一個班輪這對git的回購友好(並不會很難修改爲SVN ,merc等)它可以從repo root或任何子目錄運行。

git ls-files '*.cpp' -z | xargs -n1 -P4 -0 awk -v wd=$(pwd) '/[REGEX]/ {print "break \"" wd "/" FILENAME ":" NR "\""}' >outbreak 

其中[REGEX]是你的正則表達式。該文件是很好的,從任何目錄下運行,所以在我的情況:

mv outbreak /pathToExecutable 
cd !$ 
cgdb -x outbreak executable 

說明

-z-0,並\"都應對在路徑中有空格/ EOLS。 -n1會導致awk一次解析一個文件(否則行數將會錯誤,因爲它會將它視爲巨大的glob)。 P4允許awk一次運行4個進程(對於速度 - 可選)。 -v wd=$(pwd)將工作目錄傳遞給awk,因爲wdFILENAMENR都是awk內置的。

相關問題