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

Posted Stoneshen1211

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDB再学习:断点调试之事件断点相关的知识,希望对你有一定的参考价值。


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再学习:断点调试之数据断点