gdb 调试不停出现Program received signal SIGTRAP

5 篇文章 0 订阅

问题描述:

gdb 调试zephyr程序的时候,之前下过的某个断点,monitor reset 后重新跑,竟然会一直触发这个断点,虽然b命令已经列出当前没有break point,一直卡在这里 continue 和 next 都走不下去

问题解决:

from stack overflow 的答案: 

Ok. Long answer: Hardware breakpoints are usually set by writing to some special CPU registers. This is done by gdb. If gdb dies, it can left those installed in CPU. I guess your implementation (of gdb) does not either clear or examine those, when it connects to your target. To locate them, you would need to list the contents of hardware breakpoints registers on your CPU (don't know how to do this on STM32). Workaround would be (informed guess) be this: set few HW breakpoints (typically there are only a few, seldom more than 8) using gdb, then remove all of them. This should overwrite and then clean those hw registers. Once you do set those breakpoints (before removing them), do "continue" (just in case, as gdb sets breakpoints only at that time).

知道原因后,果断板子断电重启就解决了,中间试过板子的reset按钮竟然不行必须断电,显然板子的reset并不会给cpu断电,导致cpu寄存器的值还在的原因

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这个错误信息是指程序接收到了SIGSEGV信号,也就是发生了“段错误”(Segmentation fault)。 当程序试图访问一个未分配给它的内存地址,或者试图访问一个已经被释放的内存地址,就会发生段错误。这通常是由于程序中存在错误的指针操作或者数组越界等问题引起的。 要解决这个问题,需要找出导致段错误的代码,并进行修复。可以通过使用调试工具来定位代码中出现问题的位置。在Linux下,可以使用GDB来进行调试。在程序崩溃时,可以使用backtrace命令来查看堆栈信息,从而找出导致程序崩溃的代码行。 修复代码中的错误后,可以再次编译和运行程序,确保问题已经解决。 ### 回答2: sigsegv,即segmentation fault,中文意思是“分段错误”,是指程序试图访问未被允许访问的内存地址时发生的错误。通常情况下,这种错误是由于指针引用了一个无效的内存地址、数组越界、缓冲区溢出或者使用了已经释放的内存等原因造成的。 Segmentation fault通常在程序运行时产生,当进程访问的地址不在其内存空间中时,操作系统便会发送 SIGSEGV 信号,导致进程崩溃。而在程序开始运行之前是无法检查到这种错误的。 要解决这种错误,可以通过以下几种方法: 1.解决指针引用非法内存地址的问题,需要仔细检查代码,确保指针所引用的内存地址是有效的。 2.避免数组越界,需要在编写代码时对数组进行正确的下标操作,确保数组下标不超出范围。 3.防止缓冲区溢出,需要在处理字符数组时,使用安全的字符串函数(如strncpy等)来避免缓冲区溢出。 4.在释放内存时,确保该内存已经被释放,以免继续访问已经释放的内存,可以使用检查工具来发现这种内存泄漏问题。 总之,避免分段错误的发生,需要仔细审核程序,确保代码正确性,以及使用适当的调试工具进行检测和排除错误。 ### 回答3: 当程序在运行时收到“segmentation fault”信号时,它意味着访问了一个无效的内存地址,或者试图访问一个操作系统没有授权的内存地址空间。 这个错误通常是由以下情况引起的: 1.数组越界访问:在访问数组时,如果数组的下标超出了数组的范围,就会发生这个错误。 2.空指针访问:如果程序试图访问一个空指针,就会收到“segmentation fault”信号。 3.调用非法函数指针:如果程序试图调用一个非法函数指针,就会发生这个错误。 4.栈溢出:如果程序在栈上分配的内存超过了栈的大小,就会发生这个错误。 为了解决这个问题,我们可以采取以下步骤: 1.检查代码中是否存在越界访问数组、空指针访问等问题,并进行修复。 2.为指针分配内存之前,检查其是否为空指针。 3.确保代码中只能调用有效的函数指针。 4.减少在栈上分配的内存,或者考虑使用堆分配内存。 在诊断这个问题时,可以使用调试器来查找错误。在程序中设置断点和跟踪变量值是一种有效的方法,可以帮助程序员找到产生“segmentation fault”的代码行。同时,通过打印调试信息,可以收集有关程序崩溃时的更多信息,以便更好地进行问题定位和修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenhuxi_yu

感谢投币,继续输出

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值