之前玩过一段时间的嵌入式设备(如下叙述以手机为例)的软件开发, 当时出现了一个低概率问题: 系统开机会低概率卡死在某个模块中。 这个问题必须解决。

如果有问题的手机发布到用于手中, 假设概率万分之一, 那也非常高了, 想想某手机厂商的电池爆炸事件吧, 那是何等的低概率, 但还是发生了。

怎么定位呢? 我之前大致说过, 今天再来看看方法(如下简单示意):

// 伪代码, 不能直接运行
#include <iostream>
using namespace std;void startAAA()
{// 启动AAA模块 ...
}void myThreadFun() // 线程函数
{Sleep(1000 * 300); // 停留5分钟printf("creat core");createCore(); // 产生core文件, 一般伴随着重启手机, 所以就不显式调用rebootCellphone了
}int main()
{createTestThread(myThreadFun); // 创建线程printf("flag1");startAAA(); // 低概率卡死在此处printf("flag2");rebootCellphone(); // 重启手机// ...while(1);return 0;
}

通过不停地自动重启手机来定位, 如果卡死, 就会进入线程函数, 主动产生core, 便于分析, 最后定位出了问题, 搞了一个星期后, 最后定位出了问题: 调用某第三方基础库时, 没有按要求初始化。

思路很妙,现在回想起来, 确实有一点点激动。  其实, 我们也可以不用abort函数, 而利用一段必然core dump的代码来代替, 比如 int *p = ; *p = 0;

今天, 我们来看看abort函数的类似用途吧, 如下:

#include <iostream>
#include <cmath>
using namespace std;struct Point
{int x;int y;
};int main()
{Point po;po.x = 1;po.y = 2;float distance = sqrt(po.x * po.x + po.y * po.y);abort();return 0;
}

编译、运行并调试:

xxxxxx $ g++ test.cpp -g && ./a.out
Aborted (core dumped)
xxxxxx $
xxxxxx $
xxxxxx $
xxxxxx $ gdb a.out core
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i586-suse-linux"...
Using host libthread_db library "/lib/libthread_db.so.1".warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/libonion.so...done.
Loaded symbols for /lib/libonion.so
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /lib/libpthread.so.0...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out'.
Program terminated with signal 6, Aborted.
#0  0xb7d22aa6 in raise () from /lib/libc.so.6
(gdb) bt
#0  0xb7d22aa6 in raise () from /lib/libc.so.6
#1  0xb7d241b3 in abort () from /lib/libc.so.6
#2  0x0804867c in main () at test.cpp:18
(gdb) f 2
#2  0x0804867c in main () at test.cpp:18
18              abort();
(gdb) i locals
po = {x = 1, y = 2}
distance = 2.23606801
(gdb) q
xxxxxx $ addr2line -e a.out 0x0804867c
/data/home/erickeyli/test.cpp:18
xxxxxx $ 

顺便复习了一下addr2line,  爽爽哒。 我们可以看到, 不用打印log, 不用单步调试, 就知道变量的值了。

但是, 千千万万要注意, 带有abort函数的代码玩玩不可提交到公共库, 否则有你好受的。

用abort函数主动让进程abort/coredump, 有什么用处?------曾用此方法解决过一个低概率开机卡死的问题相关推荐

  1. c++ abort 函数_C ++中带有示例的abort()函数

    c++ abort 函数 C ++ abort()函数 (C++ abort() function) abort() function is a library function of cstdlib ...

  2. linux的基础知识——raise函数,abort函数和定时函数

    1.raise和abort函数 \qquadraise函数:int raise(int sig) \qquad功能:给当前进程发送指定信号(自己给自己发信号),raise(signo)相当于kill( ...

  3. C语言 abort 函数 - C语言零基础入门教程

    目录 一.abort 函数简介 二.abort 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.abort 函数简介 C 语 ...

  4. APUE编程:83---信号处理(SIGABRT信号与abort函数)

    一.格式 #include <stdlib.h> void abort(void); 此函数不返回 二.功能与特点 功能:abort函数将SIGABRT信号发送给调用进程,向主机环境递送一 ...

  5. C语言中的abort函数

    /* name : abort function : 异常终止一个进程 declare : void abort(void); include :#include <stdlib.h> e ...

  6. c语言中abort函数的使用

    点击上方蓝字关注我,了解更多咨询 1.abort函数的作用是异常终止一个进程,意味着abort后面的代码将不再执行. 2.当调用abort函数时,会导致程序异常终止,而不会进行一些常规的清除工作. 实 ...

  7. sigsuspend 函数和 abort 函数

    pause 函数可以阻塞进程以等待一个信号的发生,但如果该信号是阻塞的,那么该信号的传递就会被推迟直到解除阻塞.对应用程序而言,就好像该信号发生在解除阻塞和 pause 之间(取决于内核如何实现信号) ...

  8. Linux SIGABRT和abort()函数

    SIGABRT被阻塞 还有一个信号SIGABRT要特别说明,表示异常终止信号,当系统调用abort()时会发送SIGABRT信号,那么如果阻塞了该信号会影响abort()函数的使用吗? 经过测试,事实 ...

  9. abort函数和exit函数

    函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void); 头文件:#include <stdlib.h> 说明:abort函数是一个比较严重的函数,当 ...

最新文章

  1. 零起点学算法17——比较2个数大小
  2. PHP内核介绍及扩展开发指南—Extensions 的编写
  3. 基于Node的Koa2项目从创建到打包到云服务器指南
  4. 数据结构~~~线性表复习(栈的应用)
  5. Pytorch:使用Alexnet网络实现CIFAR10分类
  6. linux cacti安装教程,Linux下cacti的安装与配置
  7. (3.5)HarmonyOS鸿蒙上下左右方向滑动
  8. 登录验证应该是进行在客户端还是服务器端_网站登录认证方式
  9. Java Web学习总结(3)——Servlet详解
  10. 服务器传递文件丢包怎么回事,TCP传输协议中如何解决丢包问题
  11. docker删除镜像、容器命令
  12. 又一百度杰出科学家离职,百度研究院成中国AI的黄埔军校?
  13. SQL检索MongoDB的轻量级解决方案
  14. PGSQL触发器实例
  15. python怎么开发服务器_Python服务器开发(1)
  16. 磁盘结构损坏且无法读取硬盘磁盘结构损坏且无法读取的找回方案
  17. 山重水复疑无路,最快下降问梯度(深度学习入门系列之七)
  18. 关于STM8CAN产生bus-off如何自动恢复
  19. 台湾--身份证(本国人)正则表达式
  20. 观看 B站视频-Mysql-随堂笔记

热门文章

  1. 操作系统面试题(一)
  2. 最全解释什么是元宇宙
  3. TYPE-C接口电路设计篇(二)
  4. Xcode SDK模拟器安装及安装路径
  5. latex教程:1.2-latex现状
  6. 超宽带高速记录回放系统的分类和使用方法
  7. 世界那么大,世界那么残酷
  8. iOS11使用技巧:玩转“iMessage”
  9. 密码学——乘法密码实现
  10. 平稳随机过程通过线性系统