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

标签 c gdb breakpoints

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

我知道有一个命令 rbreakrb 但它在匹配的函数名称上设置断点,这不是我想要的。

那有可能吗?

最佳答案

在 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

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

关于c - 在 gdb 中如何在具有特定单词的任何行上设置断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34523697/

相关文章:

c - 内联汇编后指针取消引用 (SIGSEGV) 失败

c++ - 时钟获取时间 : identifier not found in Visual Studio in Windows 10

c - 为什么这两个 C 程序不会产生相同的结果?

c - 为什么 char arr[][] 类型与 char** arr 不兼容?以及如何修复它

c++ - 如何使用 GDB 捕获除一种异常类型之外的所有异常类型?

c - 获取 i386 架构下 BusyBox 的 gdb 二进制文件

linux - 永久更改 GDB 中的反汇编风格

c++ - Visual Studio 反汇编 : losing breakpoints

c++ - LLDB是如何实现设置断点功能的?

javascript - firebug:断点和 contentEditable 奇怪的行为