GDB再学习:断点调试之事件断点
Posted Stoneshen1211
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDB再学习:断点调试之事件断点相关的知识,希望对你有一定的参考价值。
系列文章目录
GDB再学习(1):前言
GDB再学习(2):编译
GDB再学习(3):GDB的启动和运行
GDB再学习(4):程序准备
GDB再学习(5):常用指令介绍
GDB再学习(5.1):常用指令介绍_print/display_查看变量或寄存器中的值
GDB再学习(5.2):常用指令介绍_examine_查看内存区域的数值
GDB再学习(5.3):常用指令介绍_backtrace_查看函数栈
GDB再学习(5.4):常用指令介绍_ptype/whatis_查看程序符号表
GDB再学习(6):断点调试之软件断点
GDB再学习(7):断点调试之硬断点
GDB再学习(8):断点调试之数据断点
GDB再学习(9):断点调试之事件断点
GDB再学习(10):线程调试相关
GDB再学习(11):如何生成Core文件
GDB再学习(12):gdb server的使用
文章目录
1 事件断点
gdb中还提供了catch命令以便我们捕获调试期间的事件,包括信号、程序开始、程序终止和C++中的异常(exception)等。
以上引用自《专业嵌入式软件开发 全面走向高质高效编程》
在gdb官方的文档中,可以设置以下事件(具体解释可参考官方文档):
指令 |
---|
throw [regexp] |
rethrow [regexp] |
catch [regexp] |
exception [name] |
exception unhandled |
handlers [name] |
assert |
exec |
syscall |
syscall [name |
fork |
vfork |
load [regexp] |
unload [regexp] |
signal [signal… |
2 程序准备
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
int j = 0;
int test2()
char* s8Buf = NULL;
strcpy(s8Buf, "8888");
return 0;
int main()
int i = 0;
for (i = 0; i < 60; i++)
j++;
printf("-------->index %d\\n", i);
sleep(1);
test2();
return 0;
3 指令介绍
3.1 捕获信号 catch signal [signal… | ‘all’]
主要有三种用法:
catch signal 捕获除 ‘SIGTRAP’ 和‘SIGINT’之外的信号
catch all 捕获全部信号
catch signal [signal] 捕获指定的信号
如下示例,设置捕获全部信号,然后Ctrl+c结束程序,就捕获到了SIGINT信号。
(gdb) start
Temporary breakpoint 1 at 0x40058f: file test_gdb.c, line 19.
Starting program: /home/test_demo/gdb/test_gdb
Temporary breakpoint 1, main () at test_gdb.c:19
19 int i = 0;
(gdb) catch signal all
Catchpoint 2 (any signal)
(gdb) c
Continuing.
-------->index 0
-------->index 1
^C
Catchpoint 2 (signal SIGINT), 0x00007ffff7ad9370 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
84 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb)
以上是关于GDB再学习:断点调试之事件断点的主要内容,如果未能解决你的问题,请参考以下文章