• 看着貌似吓人的底层问题,其实错在原本的自身


    过程   

    近期遇到一个问题,一个在Linux下运行的C语言程序,突然因为某段代码合入后,就导致程序稳定崩溃!

    程序崩溃的位置只是具有一个大方向,崩溃堆栈位置不定,而且是某些不应该出现的运行堆栈逻辑,以及曾出现过非法指令的信号异常core文件。

    通过逐步试验,发现:

    1、撤销掉新增的代码合入,就不会出现问题;还据此发布了版本

    2、如果使用O0编译程序,就不会出现崩溃问题;但使用O3优化编译就出现崩溃。怀疑是因为某些编译器代码优化导致的问题,这个就深层次了:(  看着听吓人的!

    3、旁路掉某一个模块的代码,也不会出现问题

    当时,是一头雾水,搞不清楚明确的方向!

    幸运的时,将研究的重点放在旁路的模块中,通过对代码不断二分旁路,找到问题的根源在于,某段代码对于栈内存的非法覆盖。

    示例代码

    1. // 出错代码示意
    2. typedef struct {
    3. int msgType;
    4. unsigned int msgLen;
    5. // C语言结构体的惯用法,指向头部区域后面第一个字节
    6. unsigned char abData[0];
    7. } T_SomeAck;
    8. void f(T_SomeAck* ptAck)
    9. {
    10. ...
    11. memcpy(ptAck->abData, srcData, someSize);
    12. ...
    13. }
    14. int main(int argc, char **argv)
    15. {
    16. // 栈上没有分配那么大的内存;
    17. // 解决办法:
    18. // 1、结构体定义足够内存
    19. // 2、符合C语言结构体此类惯用法,从大的缓冲区中转型;用具体结构体定义,区分头部和尾部
    20. T_SomeAck tAck;
    21. ...
    22. f(&tAck);
    23. ....
    24. return 0;
    25. }

    结论

    回想整个问题解决过程,才逐渐明白过来,就一个非法指令的信号异常处理现象,以及其它莫名奇妙、不该运行的崩溃堆栈,就可以怀疑到是因为内存被非法覆盖后引起的崩溃问题。

    因为非法覆盖的是函数返回地址等关键信息,最终导致的崩溃!


    附录

    照例说,valgrind可以发现栈内存越界的问题,后面再试试故障场景是否可以使用工具发现

    1. # valgrind 可以检查出此处的内存异常
    2. #include
    3. #include
    4. #include
    5. static int foo(void)
    6. {
    7. int a = 1;
    8. char b[32];
    9. printf("before memset\n");
    10. memset(b, 0, 64); /* stomps the stack */
    11. printf("after memset\n");
    12. return 0;
    13. }
    14. int main(int argc, char **argv)
    15. {
    16. int x;
    17. printf("before foo()\n");
    18. x = foo();
    19. printf("after foo()\n");
    20. return 0;
    21. }

  • 相关阅读:
    Java基础进阶TreeSet集合-Comparable,Comprator接口
    CompletableFuture的使用
    富芮坤蓝牙FR801xH GPIO
    Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行
    电力电子转战数字IC20220818day63——uvm入门实验5
    LeetCode:4. 寻找两个正序数组的中位数
    如何对非线性【SVM】进行三维可视化
    算法:【位运算】详解、总结、具体推导过程
    leetcode 146. LRU 缓存
    【AIGC系列】Stable Diffusion 小白快速入门课程大纲
  • 原文地址:https://blog.csdn.net/jkler_doyourself/article/details/127776795