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再学习:断点调试之事件断点的主要内容,如果未能解决你的问题,请参考以下文章

GDB再学习:断点调试之事件断点

GDB再学习:断点调试之软件断点

GDB再学习:断点调试之软件断点

GDB再学习:断点调试之硬断点

GDB再学习:断点调试之硬断点

GDB再学习:断点调试之数据断点