发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
一般来说因为局部变量导致堆栈越界的问题比较难查,因为gdb保存的也不是第一现场。
以我的经验来说,首先应该初步估计出问题的流程,然后在该流程中大量加入打印,通过打印信息缩小排查范围,然后结合代码走读查找BUG。
阅读代码时重点注意,局部变量中的数组大小,以及memset,memcpy类的系统调用,还有就是循环赋值语句。
如果问题无法复现的话,就要碰运气了。假设局部变量写越界不严重的话,可以手动推导一部分堆栈中的函数调用关系,要求对C语言的压栈过程比较熟悉。
大致上的做法是:出现SEGV时,查看寄存器esp的值,在根据esp的值打印出堆栈的信息,如果这部分数据不是全零的话,说明堆栈被写越界的太多;否则的话,还是放弃吧。
另一方面要用nm命令把调试目标的符号表取出,最好按地址排序。
接下来,就是手动对比堆栈中的现场和符号表了
来自: 共同成长888 > 《单片机程序》
0条评论
发表
请遵守用户 评论公约
C语言static变量
这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带"内部存储器"功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定...
漫谈递归:递归与循环
漫谈递归:递归与循环所谓的递归慢到底是什么原因呢?当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环则不一定,两个概念不是一个层次,不同场景做不同的尝试。除少...
keilc51可重入函数及模拟栈浅析
keilc51可重入函数及模拟栈浅析keilc51可重入函数及模拟栈浅析时间:2012-04-20 18:40:58 来源: 作者:在其它环境下(比如PC,比如ARM),...
GH6、OM
GH6、OM13817872035 发表于 2022-3-12 23:35我理解的手超8步摇是,以第一帧拍摄时传感器的位置为相对参考,后7张拍摄时通过防抖组件将其硬保持在与第一张相差x半格,x一格…比如2s下单帧成功率是80%,...
STM32发生HardFault
STM32发生HardFault我遇到的HardFault_Handler错误的原因最最多的原因是数组越界以及指针指飞,其实这两个是差不多的,都是访问了不该访问的地方导致了错误,就像一个路痴,漫无目的的走到了一个陌生的...
通过一段汇编,加深对寄存器ESP和EBP的理解
保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h mov ebp, esp ;设置EBP指针指向栈顶 NN-10h mov eax, dword ptr [ebp+0ch] ;ebp+0ch为NN-4h,即参数2的位置 mov eb...
gcc 函数堆栈
gcc 函数堆栈gcc -g -mpreferred-stack-boundary=2 -fstack-protector-all sizeof.c1. -mpreferred-stack-boundary=2 用于设置ebp的对齐方式,默认16字节对齐的,默认对齐方式会在局部变量与ebp之间有...
__stack_chk_fail栈检查失败
__stack_chk_fail栈检查失败。1. __stack_chk_fail的作用。在了函数的局部变量和保存的指令指针(译注:此处指返回地址和EBP)之间。在...
云风的 BLOG: C-- 静态语言如何提供一套合理的 gc 机制
云风的 BLOG: CC-- 静态语言如何提供一套合理的 gc 机制。这是 gc 在做根扫描时的最大障碍。系统堆栈只用于函数调用的返回地址,而堆栈数据则分配到另一个自己控制的数据堆栈上。上面说的不准确,D语言...
微信扫码,在手机上查看选中内容