GDB 调试 - 正确地加载调试符号文件
一、开发流程
1 #include <stdio.h>
2 #include <unistd.h>
3
4 void test()
5 {
6 char * s = "hello world\n";
7 while(1){
8 //int v = 0/0;
9 printf("%s\n", s);
10 sleep(1);
11 }
12 }
13
14 int main()
15 {
16 test();
17 }
gcc -ggdb3 test.c -o test
objcopy --only-keep-debug test test.debug strip --strip-debug --strip-unneeded test
objcopy --add-gnu-debuglink=test.debug test
二、开始gdb调试
很明显,这里的地址和 bt trace 里的地址相差甚远,由于操作系统的保护机制(ASLR) ,ELF 文件并不会直接加载到这个地址,而是会加载到一个随机地址上。因此,我们需要找到这个地址,并把符号表内所有符号的地址都加上这个偏移量(gdb 应该也是可以自动完成这个操作的?)
找到 .text 段加载的位置:
gdb 加载调试符号:
detach & attach 后一切正常了,似乎是 gdb 的一个bug,先attach后加载符号文件会有问题。
三、动态加载的SO添加符号文件:
代码:
1 #include <stdio.h>
2 #include <unistd.h>
3 #include "test.h"
4
5 static void test()
6 {
7 char * s = "hello so\n";
8 while(1){
9 printf("%s\n", s);
10 sleep(1);
11 }
12 }
13
14 void test_so()
15 {
16 test();
17 }
1 #include "test.h"
2
3 int main()
4 {
5 test_so();
6 }
编译 & 链接 & strip:
gcc test.c -ggdb3 -shared -fPIC -o libtest.so
gcc test.c -ggdb3 -shared -o libtest.so
objcopy --only-keep-debug libtest.so libtest.so.debug
strip --strip-debug --strip-unneeded libtest.so
开始加载调试符号:
总结:
参考:
GDB 调试 - 正确地加载调试符号文件的更多相关文章
- ASP.NET MVC3 Razor 调试与预加载
目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载 在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...
- 提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
新版本SQLITE,如果下载Precompiled Binaries版会出现提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll. 下载Prec ...
- Android 多种方式正确的加载图像,有效避免oom
图像加载的方式: Android开发中消耗内存较多一般都是在图像上面,本文就主要介绍怎样正确的展现图像减少对内存的开销,有效的避免oom现象.首先我们知道我的获取图像的来源一般有三种源头:1.从网络加 ...
- [原]排错实战——解救加载调试符号失败的IDA
原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windb ...
- u-boot移植总结(二)LED点灯调试 和 u-boot加载地址
(一)LED点灯调试 FL2440电路总共有4个LED0,LED1,LED2,LED3,分别接到板子GPB5,GPB6,GPB8,GPB10引脚.通过设置三个寄存器GPBCON(0x56000010) ...
- Windows下pycharm远程连接服务器调试-tensorflow无法加载问题
最近打算在win系统下使用pycharm开发程序,并远程连接服务器调试程序,其中在import tensorflow时报错如图所示(在远程服务器中执行程序正常): 直观错误为: ImportError ...
- 【Atheros】内核调试及网卡加载等问题小结
我做的其他很多工作就比较有针对性了,不是什么大众性的问题,比如加统计代码.实现自己的速率调整算法或者加一些自己的控制什么的,就不再单独介绍了,最后呢再罗列一些小问题,供参考. 1. 加载模块(执行wi ...
- GDB调试工具、动态加载、内存管理(day04)
一.程序中的错误处理 在系统中定义了一个全局变量errno.在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号).然后根据错误编号获取错误信息. 举例说明: 打开一个文件,如果这个文件不存在 ...
- [转]IE9.0或者360下js(JavaScript、jQuery)不能正确执行(加载),按F12后执行正常;Firefox下ajax的success返回数据data(json、string)无法获取
兼容问题1: 页面的分享等插件加载不全,并无法点击. 兼容问题2: IE下页面选择器(#id..class.etc.)绑定click事件无法访问到,后台springmvc方法,也无法获取ajax的su ...
- 如何正确的加载和执行 JavaScript 代码
无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行 ...
随机推荐
- Windows Codename"Longhorn" Build 4074体验
Windows Codename"Longhorn" Build 4074体验 Wimndows Coodename "Longhorn"就是WindowsVi ...
- cmake 设置属性INTERFACE_INCLUDE_DIRECTORIES,则其它库可以直接 target_link_libraries?
rs项目改为cpm下载 项目 leveldb 和 basiccache, basiccache依赖 leveldb,下载都是在主项目中, 设置 INTERFACE_INCLUDE_DIRECTORI ...
- What is REST and Restful?
什么是rest 和 restful? 提出rest的作者,目的:符合框架原理的情况下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强,性能好,适宜通讯的架构. Fielding将他对互联网 ...
- vmware 二次虚拟化
在创建的虚拟机的目录内找到扩展名为vmx的文件,在文件的最后添加 hypervisor.cpuid.v0 = "FALSE" 保存 重新打开虚拟机在 在虚拟机配置开启虚拟化
- 32.自定义Java异常捕获处理类及其使用
自定义异常捕获处理类 /** * <h1>异常捕捉</h1> * */ public class ExceptionHandler implements Thread.Unca ...
- JAVA笔记:double四舍五入并保留两位小数的方法
1.只要输出结果 double x1 = 0.026; System.out.println(String.format("%.2f", x1)); 2.数据转换 //方案一: g ...
- nginx代理出现上传文件过大解决办法
1.错误描述 2.错误原因 1.上传文件时,利用localhost访问系统,不会出现这个问题:用域名访问这个系统时,出现这个问题,提示是:请求实体太大 由于Nginx反向代理服务器client_max ...
- 用cmd的方式执行exe程序
在asp.net中调用process.start执行程序,需要设置运行iis进程用户的权限,比较麻烦, MS的站点上有一篇说明:http://support.microsoft.com/default ...
- 三种将list转换为map的方法
1) 传统方法假设有某个类如下 Java代码 class Movie { private Integer rank; private String description; public Movie( ...
- weblogic10.3.1.0安装(windows版)
转: weblogic10.3.1.0安装(windows版) 安装完成后 配置数据源 然后配置部署项目. myeclipse 配置weblogic