C语言RELEASE版本程序堆栈调试信息分离和还原

news/2025/3/13 10:45:08/文章来源:https://www.cnblogs.com/microestc/p/18769460

C程序DEMO 文件 main.c

#define _GNU_SOURCE
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <stdint.h>
#include <ucontext.h>
#include <unistd.h>
#include <sys/wait.h>
#include <setjmp.h>static void *buffer[100] = {0}; // 用于存储地址列表
static int nptrs = 0;
static sigjmp_buf jmpbuf;void print_stack_trace()
{printf("Relative addresses:\n");for (int i = 0; i < nptrs; i++){Dl_info info;if (dladdr(buffer[i], &info) != 0){uintptr_t base = (uintptr_t)info.dli_fbase;printf("Frame base %p\n", info.dli_fbase);uintptr_t addr = (uintptr_t)buffer[i];printf("Frame %d: relative offset = 0x%lx\n", i, (unsigned long)(addr - base));}else{printf("Frame %d: no information available\n", i);}}
}void segv_handler(int sig)
{// 捕获调用栈nptrs = backtrace(buffer, 100);backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO);siglongjmp(jmpbuf, 1);
}void crash_function()
{int *p = NULL;*p = 42; // 故意制造一个段错误
}int main()
{int jmpid = 0;pid_t pid = fork();if (pid < 0) {perror("fork failed");exit(1);}if (pid == 0) {// 子进程pid_t cpid = getpid();printf("Child: %d \n", cpid);jmpid = setjmp(jmpbuf);if (jmpid == 0){signal(SIGSEGV, segv_handler);}else{printf("Child tag: %d \n", cpid);// print_stack_trace();signal(SIGSEGV, SIG_DFL);kill(pid, SIGSEGV);}} else {// 父进程printf("Parent: %d \n", getpid());// 等待子进程结束waitpid(pid, NULL, 0);printf("Parent end: %d \n", getpid());exit(0);}crash_function();return 0;
}

编译 -O2 优化

mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ gcc -o2 main.c -o main 
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ ./main 
Parent: 26425 
Child: 26426 
./main(+0x130b)[0x55c0f8c7930b]
/lib/x86_64-linux-gnu/libc.so.6(+0x3c050)[0x7fbcc0f09050]
./main(+0x1351)[0x55c0f8c79351]
./main(+0x1483)[0x55c0f8c79483]
/lib/x86_64-linux-gnu/libc.so.6(+0x2724a)[0x7fbcc0ef424a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)[0x7fbcc0ef4305]
./main(+0x1141)[0x55c0f8c79141]
Child tag: 26426 
Segmentation fault (core dumped)
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main 0x1483
??:?
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ 

-O2 优化后生成的程序 main 不能通过堆栈的相对地址查询到堆栈信息

编译 -g -O2 附加调试信息和优化

mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ gcc -g -o2 main.c -o main 
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ ./main 
Parent: 27118 
Child: 27119 
./main(+0x130b)[0x5569150ce30b]
/lib/x86_64-linux-gnu/libc.so.6(+0x3c050)[0x7fa78e6d4050]
./main(+0x1351)[0x5569150ce351]
./main(+0x1483)[0x5569150ce483]
/lib/x86_64-linux-gnu/libc.so.6(+0x2724a)[0x7fa78e6bf24a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)[0x7fa78e6bf305]
./main(+0x1141)[0x5569150ce141]
Child tag: 27119 
Segmentation fault (core dumped)
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main 0x1483
/home/mestc/repos/cpp/main.c:93

剔除调试信息

mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ objcopy --only-keep-debug main main.debug
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main 0x1483
/home/mestc/repos/cpp/main.c:93
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main.debug 0x1483
/home/mestc/repos/cpp/main.c:93
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ ./main
Parent: 27844 
Child: 27845 
./main(+0x130b)[0x5556cb0a430b]
/lib/x86_64-linux-gnu/libc.so.6(+0x3c050)[0x7f1e086d2050]
./main(+0x1351)[0x5556cb0a4351]
./main(+0x1483)[0x5556cb0a4483]
/lib/x86_64-linux-gnu/libc.so.6(+0x2724a)[0x7f1e086bd24a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)[0x7f1e086bd305]
./main(+0x1141)[0x5556cb0a4141]
Child tag: 27845 
Segmentation fault (core dumped)
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ ./main.debug 
bash: ./main.debug: cannot execute binary file: Exec format error
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ strip --strip-debug main
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main 0x1483
??:?
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ ./main
Parent: 28082 
Child: 28083 
./main(+0x130b)[0x55b2ac28d30b]
/lib/x86_64-linux-gnu/libc.so.6(+0x3c050)[0x7f9f691f2050]
./main(+0x1351)[0x55b2ac28d351]
./main(+0x1483)[0x55b2ac28d483]
/lib/x86_64-linux-gnu/libc.so.6(+0x2724a)[0x7f9f691dd24a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85)[0x7f9f691dd305]
./main(+0x1141)[0x55b2ac28d141]
Child tag: 28083 
Segmentation fault (core dumped)
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main.debug 0x1483
/home/mestc/repos/cpp/main.c:93
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ 

还原 main 的调试信息

mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ objcopy --add-gnu-debuglink=main.debug main
mestc@DESKTOP-4OJQ0ID:~/repos/cpp$ addr2line -e main 0x1483
/home/mestc/repos/cpp/main.c:93

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChromeOS 134 版本更新

Chrome OS 134 版本更新ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端(Kiosk)模式支持隔离 Web 应用(Isolated Web Apps) 从 ChromeOS 134 开始,自助终端(Kiosk)模式支持 隔离 Web 应用(Isolated Web Apps,IWA),提供 更安全、更强大 的应用…

ChromeOS 133 版本更新

ChromeOS 133 版本更新 1. 增强托管用户的 Office 文件处理功能 从 ChromeOS 133 开始,托管用户 现在可以 无缝打开和编辑 Microsoft Office 文件(Word、PowerPoint、Excel),无论他们使用的是 Microsoft 365(Office for the web) 还是 Google Workspace。 1.1. 对不同用户…

搭建扫码挪车功能及源码分享

实现效果如图:首先要到这里去申请一个微信通知应用,有了这个应用才能接收到微信的通知: https://wxpusher.zjiecode.com/admin扫码注册后新建一个应用,你会获得一个appToken 再扫码就能获得你的UID(https://wxpusher.zjiecode.com/admin/main/wxuser/list 这个用户列表里面…

氛围灯系统(VALS)

随着汽车智能化、个性化、舒适性的需求逐年提高,汽车已不再只是简单的交通工具,而是一个能够为人们带来舒适与惬意的场所。高品质的汽车内饰照明在其中扮演了重要的角色,已成为汽车内饰领域中不可忽视的设计元素。氛围灯是一种应用在汽车内部,用于烘托车内环境氛围的内饰灯…

嘎嘎好用!推荐三款开源的 Redis 桌面客户端!

三款开源的 Redis 桌面客户端工具,开箱即用!大家好,我是 Java陈序员。 在日常开发中,经常会使用到 Redis, 为了更好的查看和操作 Redis 中的数据,通常会借助可视化操作客户端工具。 今天,给大家介绍三款开源的 Redis 桌面客户端工具,开箱即用!关注微信公众号:【Java陈…

​政务信创实施宝典:从项目治理到交付的7种必备工具链

政务信创实施是推动政府数字化转型、提升政务服务效能的重要举措。在实施过程中,从项目治理到交付需要运用一系列的工具链,以确保项目的顺利进行和目标的实现。本文将详细介绍七种必备的工具链,帮助政务信创项目实现高效、高质量的实施。 需求管理工具链 需求管理是政务信创…

84. 柱状图中最大的矩形(难)

目录题目单调题解:递增栈 题目给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。单调题解:递增栈左边补0:让heights 数组的索引 0 入栈;右边补0:栈中的 bar 都比它高,能一一出栈。con…

[Welcome to my blog]

欢迎! \(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 一落红,一枯叶,…

银河麒麟系统配置静态IP

查看网卡名称 ifconfig或 ip addr记住网卡名,下面要用 修改配置文件 vim /etc/network/interfaces 修改内容如下 source /etc/network/interfaces.d/auto enp4s3 iface enp4s3 inet static address 192.168.0.20 netmask 255.255.255.0 gateway 192.168.0.1修改DNS(可选) vi…

MinGW

上次安装,这次又忘了,还是记一下吧 MinGW(Minimalist GNU for Windows)是一个面向Windows操作系统的开发环境,包含了GNU编译器套装(GCC)和其他一些自由软件开发及应用工具。 使用MinGW,开发者可以在Windows平台上编译、构建和运行用C、C++等多种语言编写的应用程序。 下…

Markdown使用html实现折叠

一、文字 <details> <summary>效果</summary> 文本内容 </details>效果 文本内容二、代码块 <details> <summary>效果</summary> ``` 代码 ``` </details>效果 代码三、图片 <details> <summary>效果</summary…

算法心得(3)**差分**

**思路** 差分可以简单的看成**序列中每个元素与其前一个元素的差**一般认为它相当于前缀和的 逆运算 一般在情况满足两个条件时就使用它:(1)影响可以累加(2)有多个影响差分序列的作用:快速一个序列中某个区间内的所有值同时加上或减去一个常数 拿给一维数组A来说:…