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

Posted Stoneshen1211

tags:

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


1 硬件断点

在嵌入式系统中,如果想调试的程序不是位于内存中,而是位于像闪存这样的存储器中,此时就无法使用软件程序断点了,因为闪存中的内容并不像内存那样方便更改。

此时只能使用硬件程序断点来调试程序。硬件程序断点的实现原理与软件程序断点完全不同,断点时通过配置处理器的断点寄存器的方式来实现的。

当处理器运行到断点寄存器所指示位置的指令时就会产生中断,调试工具通过该中断使我们获得干预的机会。处理器所能设置的硬件程序断点数量是有限的,可能最多也就4个。

以上引用自《专业嵌入式软件开发 全面走向高质高效编程》

目前的ARM7/ARM9内部硬件能够提供两组寄存器来存储断点信息,所以最多可以支持两个硬件断点,而ARM11则最多可以支持8个硬件断点。

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 设置硬断点 hbreak

hbreak和break的使用方式一致。

如下,设置23行断点:

(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) hbreak 23
Hardware assisted breakpoint 2 at 0x40059f: file test_gdb.c, line 23.
(gdb) continue
Continuing.

Breakpoint 2, main () at test_gdb.c:23
23			j++;
(gdb) continue
Continuing.
-------->index 0

Breakpoint 2, main () at test_gdb.c:23
23			j++;
(gdb) continue
Continuing.
-------->index 1

Breakpoint 2, main () at test_gdb.c:23
23			j++;
(gdb) continue
Continuing.
-------->index 2

Breakpoint 2, main () at test_gdb.c:23
23			j++;
(gdb) continue
Continuing.
-------->index 3

Breakpoint 2, main () at test_gdb.c:23
23			j++;
(gdb) 

3.2 设置一次有效硬断点 thbreak

thbreak和tbreak的使用方式一致,这里不再赘述。

以上是关于GDB再学习:断点调试之硬断点的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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