文章目录

  • 1 硬件断点
  • 2 程序准备
  • 3 指令介绍
  • 3.1 设置硬断点 hbreak
  • 3.2 设置一次有效硬断点 thbreak



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的使用方式一致,这里不再赘述。