在gdb中如何在任何具有特定单词的行上设置断点?

我想在我的程序在gdb下执行时,
在执行任何代码行之前,检查行是否有特定的单词示例宏名称或变量名称或任何特定单词,如果有,则停止执行.
如果可以使用正则表达式完成更好.

我知道有一个命令rbreak或rb但是在匹配的函数名称上设置了断点,这不是我想要的.

那有可能吗?

最佳答案
在gdb之外,您可以先搜索源并列出断点,然后使用-x标志调用gdb来设置这些断点.

计划

  • grep over the source for user-defined patterns ( eg. erase, delete )
  • generate the break statements based on above line numbers, write these to file
  • call gdb with -x flag and point at generated file with break statements

男人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";

example.c

#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语句)
>也可以使用forward-search和b在gdb中执行此操作

转载注明原文:在gdb中如何在任何具有特定单词的行上设置断点? - 代码日志