内存泄露和crash定位 都要加-g

发布时间:2026/10/28 18:18:53

内存泄露和crash定位 都要加-g 内存泄露定位:#include mcheck.h启动函数开头定义:setenv(MALLOC_TRACE, mtrace.out, 1);mtrace();crach定位:参考在Linux中如何利用backtrace信息解决程序崩溃的问题_the backtrace does not contain enough meaningful f-CSDN博客/* * dump.c */ #include stdio.h #include stdlib.h #include unistd.h #include signal.h /* for signal */ #include execinfo.h /* for backtrace() */ #define BACKTRACE_SIZE 16 void dump(void) { int j, nptrs; void *buffer[BACKTRACE_SIZE]; char **strings; nptrs backtrace(buffer, BACKTRACE_SIZE); printf(backtrace() returned %d addresses\n, nptrs); strings backtrace_symbols(buffer, nptrs); if (strings NULL) { perror(backtrace_symbols); exit(EXIT_FAILURE); } for (j 0; j nptrs; j) printf( [%02d] %s\n, j, strings[j]); free(strings); } void signal_handler(int signo) { #if 0 char buff[64] {0x00}; sprintf(buff,cat /proc/%d/maps, getpid()); system((const char*) buff); #endif printf(\ncatch signal %d \n, signo); printf(Dump stack start...\n); dump(); printf(Dump stack end...\n); signal(signo, SIG_DFL); /* 恢复信号默认处理 */ raise(signo); /* 重新发送信号 */ } int main(int argc, char *argv[]) { int sum 0x00; signal(SIGSEGV, signal_handler); /* 为SIGSEGV信号安装新的处理函数 */ sum add(sum); printf( sum %d \n, sum); return 0x00; }....................................................7f0962fb3000-7f0962fb4000 r-xp 00000000 08:01 2895572 /home/share/work/backtrace/libadd.so7f0962fb4000-7f09631b3000 ---p 00001000 08:01 2895572 /home/share/work/backtrace/libadd.so7f09631b3000-7f09631b4000 r--p 00000000 08:01 2895572 /home/share/work/backtrace/libadd.so7f09631b4000-7f09631b5000 rw-p 00001000 08:01 2895572 /home/share/work/backtrace/libadd.so.....................................................catch signal 11 Dump stack start...backtrace() returned 8 addresses[00] ./backtrace(dump0x1f) [0x400b7f][01] ./backtrace(signal_handler0x83) [0x400c99][02] /lib/x86_64-linux-gnu/libc.so.6(0x36150) [0x7f0962c2b150][03] ./libadd.so(add10x1a) [0x7f0962fb35c6][04] ./libadd.so(add0x1c) [0x7f0962fb35f9][05] ./backtrace(main0x2f) [0x400b53][06] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main0xed) [0x7f0962c1676d][07] ./backtrace() [0x400a69]Dump stack end...段错误 (核心已转储)所有我们正确的地址应为0x7f0962fb35c6 - 7f0962fb3000 0x5c6将这个地址利用addr2line命令得到如下结果addr2line -e libadd.so 0x5c6##############废弃##################本文出自http://www.linuxidc.com/Linux/2012-11/73470p2.htm其实很多错误不能捕获,这只是一种方法!通常情况系程序发生段错误时系统会发送SIGSEGV信号给程序缺省处理是退出函数。我们可以使用 signal(SIGSEGV, your_function);函数来接管SIGSEGV信号的处理程序在发生段错误后自动调用我们准备好的函数从而在那个函数里来获取当前函数调用栈。 但是实际运用中,有些错误还是无法定位!信号定义:参考:如何在linux程序中捕获异常信号_在程序里面捕获段错误或者栈溢出的信号-CSDN博客01SIGHUP本信号在用户终端连接正常或非正常结束时发出通常是在终端的控制进程结束时通知同一session内的各个作业这时它们与控制终端不再关联02SIGINT程序终止interrupt信号在用户键入INTR字符通常是Ctrl-C时发出03SIGQUIT和SIGINT类似但由QUIT字符通常是Ctrl-来控制。进程在因收到SIGQUIT退出时会产生core文件在这个意义上类似于一个程序错误信号04SIGILL执行了非法指令。通常是因为可执行文件本身出现错误或者试图执行数据段。堆栈溢出时也有可能产生这个信号05SIGTRAP由断点指令或其它trap指令产生由debugger使用06SIGABRT程序自己发现错误并调用abort时产生06SIGIOT在PDP-11上由iot指令产生在其它机器上和SIGABRT一样07SIGBUS非法地址包括内存地址对齐alignment出错。eg访问一个四个字长的整数但其地址不是4的倍数08SIGFPE在发生致命的算术运算错误时发出。不仅包括浮点运算错误还包括溢出及除数为0等其它所有的算术的错误09SIGKILL用来立即结束程序的运行。本信号不能被阻塞处理和忽略10SIGUSR1留给用户使用11SIGSEGV试图访问未分配给自己的内存或试图往没有写权限的内存地址写数据12SIGUSR2留给用户使用13SIGPIPEBrokenpipe14SIGALRM时钟定时信号计算的是实际的时间或时钟时间。alarm函数使用该信号15SIGTERM程序结束terminate信号与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。shell命令kill缺省产生这个信号17SIGCHLD子进程结束时父进程会收到这个信号18SIGCONT让一个停止stopped的进程继续执行。本信号不能被阻塞。可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作。例如重新显示提示符19SIGSTOP停止stopped进程的执行。注意它和terminate以及interrupt的区别该进程还未结束只是暂停执行。本信号不能被阻塞处理或忽略20SIGTSTP停止进程的运行但该信号可以被处理和忽略。用户键入SUSP字符时通常是Ctrl-Z发出这个信号21SIGTTIN当后台作业要从用户终端读数据时该作业中的所有进程会收到SIGTTIN信号。缺省时这些进程会停止执行22SIGTTOU类似于SIGTTIN但在写终端或修改终端模式时收到23SIGURG有”紧急”数据或out-of-band数据到达socket时产生24SIGXCPU超过CPU时间资源限制。这个限制可以由getrlimit/setrlimit来读取/改变25SIGXFSZ超过文件大小资源限制26SIGVTALRM虚拟时钟信号。类似于SIGALRM但是计算的是该进程占用的CPU时间27SIGPROF类似于SIGALRM/SIGVTALRM但包括该进程用的CPU时间以及系统调用的时间28SIGWINCH窗口大小改变时发出29SIGIO文件描述符准备就绪可以开始进行输入/输出操作30SIGPWRPowerfailure举例如下#include stdio.h#include stdlib.h#include stddef.h#include execinfo.h#include signal.hvoid dump(int signo){void *buffer[30] {0};size_t size;char **strings NULL;size_t i 0;size backtrace(buffer, 30);//以下2函数用于获得本进程当前栈信息。定位段错误地址fprintf(stdout, Obtained %zd stack frames.nm\n, size);strings backtrace_symbols(buffer, size);if (strings NULL){perror(backtrace_symbols.);exit(EXIT_FAILURE);}for (i 0; i size; i){fprintf(stdout, %s\n, strings[i]);}free(strings);strings NULL;exit(0);}void func_c(){*((volatile char *)0x0) 0x9999;}void func_b(){func_c();}void func_a(){func_b();}int main(int argc, const char *argv[]){signal(SIGABRT, dump);signal(SIGBUS, dump);if (signal(SIGSEGV, dump) SIG_ERR)perror(cant catch SIGSEGV);func_a();return 0;}编译程序-rdynamic 才能打印调用函数 -g调试模式才能使用addr2line定位地址gcc -g-rdynamictest.c -o test; ./test输出如下Obtained6stackframes.nm./backstrace_debug(dump0x45)[0x80487c9][0x468400]./backstrace_debug(func_b0x8)[0x804888c]./backstrace_debug(func_a0x8)[0x8048896]./backstrace_debug(main0x33)[0x80488cb]/lib/i386-linux-gnu/libc.so.6(__libc_start_main0xf3)[0x129113]接着objdump -d test test.s在test.s中搜索804888c如下8048884 func_b:8048884: 55 push %ebp8048885: 89 e5 mov %esp, %ebp8048887: e8 eb ff ff ff call 8048877 func_c804888c: 5d pop %ebp804888d: c3 ret其中80488c时调用call 8048877C函数后的地址虽然并没有直接定位到C函数通过汇编代码 基本可以推出是C函数出问题了pop指令不会导致段错误的。我们也可以通过addr2line来查看addr2line 0x804888c -e backstrace_debug -f输出func_b/home/astrol/c/backstrace_debug.c:57###############################################coredump:1.内核支持CONFIG_COREDUMPyCONFIG_ELF_COREyCONFIG_CORE_DUMP_DEFAULT_ELF_HEADERSy2.添加代码/** 在 main() 内通过 signal() 接管 SIGSEGV/SIGILL/* SIGBUS/SIGFPE/SIGABRT崩溃时转换为 sys_error: exit(1)内核默认动作被* 取消进程无法生成 core 文件。这里定义同名 signal()借助 ELF 符号介入* 主程序定义优先于动态库把 SDK 对致命信号的注册强制改为 SIG_DFL* 使崩溃回到内核默认路径进入 do_coredump()。* 注意这会关闭 SDK 自带的崩溃清理/错误码上报逻辑仅用于调试固件。*/#include signal.h#include string.hextern C __sighandler_t signal(int sig, __sighandler_t handler){static const int fatal_signals[] {SIGSEGV, SIGILL, SIGBUS, SIGFPE, SIGABRT};struct sigaction sa;struct sigaction old;bool fatal false;size_t i;for (i 0; i sizeof(fatal_signals) / sizeof(fatal_signals[0]); i) {if (sig fatal_signals[i]) {fatal true;break;}}memset(sa, 0, sizeof(sa));sigemptyset(sa.sa_mask);sa.sa_flags SA_RESTART;sa.sa_handler fatal ? SIG_DFL : handler;if (sigaction(sig, sa, old) 0)return SIG_ERR;return old.sa_handler;}3.编译链-Wl,--export-dynamic -g4.运行程序前执行:ulimit -c unlimitedmkdir -p /mnt/sdcard/echo /mnt/sdcard/core_%e_%p_%t | sudo tee /proc/sys/kernel/core_pattern5.延长看门狗时间到2分钟或者关闭看门狗确保coredump生成写入完整6. 程序备份复现用的程序test、test_gbd、代码要对应方便coredump文件解析对应7.分析gdb ./test ./core
延伸阅读

更多相关文章

2026/10/28 18:18:53

vc入门宝典七(工具栏)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 18:18:53

AVID Media Composer介绍

AVID Media Composer 一、基础介绍1. 软件功能介绍Avid是目前全球最大的专业视音频产品及解决方案提供商,其产品覆盖视音频的所有环节。AVID Media Composer是其主要的非线性编辑软件,全球著名的电视机构均采用Avid的相关产品。2. AVID 剪辑流程收集磁带…

2026/10/28 18:18:53

赛灵思CEO警示:AI芯片创业勿扎堆,FPGA差异化或是出路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 19:29:07

智能体编程:2026年技术趋势与实战指南

1. 智能体编程的现状与2026趋势概览过去三年间,智能体编程已经从实验室概念发展为改变软件开发范式的关键技术。根据最新行业调研,2023年采用智能体架构的企业项目数量同比增长470%,GitHub上相关开源项目星标总数突破50万。这种爆发式增长背后…

2026/10/28 19:29:07

AI提示词入门:四要素模板与写作助理实战

简介:《AI提示词大全》基础版.pdf 是一份面向AIGC初学者与日常办公人群的提示词参考资料,聚焦如何用更清晰的指令提升大语言模型的输出质量与交互效率。文档围绕写作助理、提示词修改器、提示词生成器、英语翻译或修改、论文式回答、语音输入优化等场景展…

2026/10/28 19:29:07

计算机发展史:从机械计算到云计算的演进

1. 机械计算的黎明:巴贝奇与差分机1801年,法国纺织工人约瑟夫玛丽雅卡尔发明了用打孔卡片控制的织布机,这种二进制控制理念为后来的计算机发展埋下了伏笔。但真正将机械计算推向理论高峰的,是英国数学家查尔斯巴贝奇。巴贝奇在182…

2026/10/28 19:29:07

PP-OCRv5与OpenVINO模型转换部署实战指南

1. PP-OCRv5与OpenVINO技术背景解析PP-OCRv5是PaddlePaddle团队推出的最新OCR识别系统,其server版本针对服务端场景进行了专项优化。相比前代版本,v5在识别精度和推理速度上都有显著提升,特别是在处理复杂版面和低质量图像时表现突出。而Open…

2026/10/28 19:29:07

Linux PATH环境变量攻击与权限提升防御

1. Linux权限提升中的PATH环境变量攻击解析在Linux系统安全领域,PATH环境变量滥用导致的权限提升(Privilege Escalation)是最经典的攻击手法之一。这种攻击利用了Linux系统中环境变量和SUID(Set User ID)机制的特性组合…

2026/10/28 19:24:07

SPICE网表语法避坑指南:从元件命名到仿真调试

简介:这份PPT面向电子工程、集成电路设计方向的学生与工程师,系统梳理SPICE电路仿真语言的语法规则,帮助读者看懂并独立编写规范的电路网表。内容覆盖一般语法规定、信号源、无源元件、点命令与半导体器件等模块,具体讲解大小写与…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑