2015-12-30 86 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内置的。

相关问题