core dump
来源:互联网 发布:php网站打开一片空白 编辑:程序博客网 时间:2024/06/05 14:09
#include <execinfo.h>
#include <pthread.h>
#include <signal.h>
static void print_trace(int iSig)
{int i;
const int MAX_CALLSTACK_DEPTH = 32; /* 需要打印堆栈的最大深度 */
void *traceback[MAX_CALLSTACK_DEPTH]; /* 用来存储调用堆栈中的地址 */
/* 利用 addr2line 命令可以打印出一个函数地址所在的源代码位置
* 调用格式为: addr2line -f -e /tmp/a.out 0x400618
* 使用前,源代码编译时要加上 -rdynamic -g 选项
*/
char cmd[512] = "addr2line -f -e ";
char *prog = cmd + strlen(cmd);
/* 得到当前可执行程序的路径和文件名 */
int r = readlink("/proc/self/exe",prog,sizeof(cmd)-(prog-cmd)-1);
/* popen会fork出一个子进程来调用/bin/sh, 并执行cmd字符串中的命令,
* 同时,会创建一个管道,由于参数是'w', 管道将与标准输入相连接,
* 并返回一个FILE的指针fp指向所创建的管道,以后只要用fp往管理里写任何内容,
* 内容都会被送往到标准输入,
* 在下面的代码中,会将调用堆栈中的函数地址写入管道中,
* addr2line程序会从标准输入中得到该函数地址,然后根据地址打印出源代码位置和函数名。
*/
FILE *fp = popen(cmd, "w");
/* 得到当前调用堆栈中的所有函数地址,放到traceback数组中 */
int depth = backtrace(traceback, MAX_CALLSTACK_DEPTH);
for (i = 0; i < depth; i++)
{
/* 得到调用堆栈中的函数的地址,然后将地址发送给 addr2line */
fprintf(fp, " %p\n", traceback[i]);
/* addr2line 命令在收到地址后,会将函数地址所在的源代码位置打印到标准输出 */
}
fclose(fp);
if (iSig != 0)
signal(iSig, NULL);
//exit(-1);
}
signal(SIGSEGV, print_trace);
0 0
- Core Dump
- Core Dump
- Core Dump?!
- Core Dump?!
- Core Dump?!
- core dump
- core dump
- Core Dump
- core dump
- Core dump
- core dump
- Core Dump
- core dump
- core dump
- Core Dump
- core dump
- Core Dump
- core dump
- remove_if的使用
- 一道概率题-51nod11B
- oc学习笔记—内存管理
- 第五届蓝桥杯 软件类省赛真题 第一题:猜年龄
- wifi下的android手机访问tomcat
- core dump
- wuti
- 最大子矩阵
- LAN Base、IP Base 和IP Service
- 训练指南DP例题读后感
- 删除算法 remove()
- 3715: [PA2014]Lustra|暴力
- Android Context 是什么?
- 8数码