ubuntu 调试库

本文介绍如何在Linux环境下安装带有调试信息的libc,并指导如何下载libc源码及设置gdb使用这些源码进行调试。通过具体步骤说明,读者可以学会如何跟踪到printf()函数内部。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.安装带有调试信息的libc: sudo apt-get install libc6-dbg 
2.下载libc源码 
    a.选定一个放置源码的目录并进入,如 /home/kent/dev-os/libc6-source 
    b.执行sudo apt-get source libc6, 会把源码下载到当前目录中。
最后源码目录大概是:/home/kent/dev-os/libc6-source/eglibc-2.15 
  www.2cto.com  
3.运行gdb时指定libc源码目录:gdb `find /home/kent/dev-os/libc6-source/eglibc-2.15 -type d -printf '-d %p '`  my_program 
4.最后进入printf()函数即可. 我这里看到的第一行代码是
va_list arg;

 

转载于:https://www.cnblogs.com/nmgxbc/p/3829983.html

<think>好的,用户想知道在Ubuntu上如何使用GDB调试动态,特别是涉及dlopen的情况。我需要整理相关的方法和步骤,确保回答准确且有参考依据。 首先,根据引用[3],设置LD_LIBRARY_PATH是必要的,这样程序运行时能找到动态。应该提醒用户导出这个变量或者在使用GDB时设置环境变量。 然后,启动GDB并加载主程序,如引用[2]提到的使用file命令载入主执行文件。接着,在dlopen处设置断点,如引用[1]和[4]提到的,可以break dlopen来捕捉加载事件。用户可能需要在加载后检查符号,这时候info sharedlibrary命令就派上用场了,如引用[1]和[2]所示。 调试初始化问题的话,需要在的构造函数或初始化函数设置断点,比如使用break _init或者内的具体函数。动态本身的调试需要编译时加入-g选项,这点需要强调,确保用户生成带有调试信息的。 延迟加载的情况,引用[1]提到在dlopen之后检查符号,所以应该建议用户在加载后逐步执行,并验证符号是否正确加载。另外,使用LD_DEBUG环境变量可以帮助查看加载的详细过程,这也是一个有用的技巧。 可能需要分步骤说明,比如准备调试环境、设置断点、运行和检查符号等。同时,注意引用对应的参考文献,确保每个步骤都有依据。最后,生成相关问题,帮助用户进一步深入学习,比如如何分析动态加载失败或优化调试流程。</think>### 如何在Ubuntu上使用GDB调试动态(涉及dlopen) #### 1. **准备调试环境** - **编译动态和主程序时添加调试信息** 在编译命令中加入 `-g` 选项,例如: ```bash gcc -g -fPIC -shared mylib.c -o libmylib.so gcc -g main.c -o main -ldl ``` 确保动态和主程序均包含符号表信息[^3]。 - **设置动态路径** 通过 `LD_LIBRARY_PATH` 指定动态的搜索路径: ```bash export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH ``` 或在GDB中运行时直接设置: ```bash LD_LIBRARY_PATH=/path/to/libs gdb ./main ``` 避免因路径问题导致加载失败[^3][^4]。 --- #### 2. **在GDB中设置断点** - **在`dlopen`调用处中断** 使用 `break dlopen` 命令捕获动态加载事件: ```bash (gdb) break dlopen ``` 运行程序后,GDB会在调用`dlopen`时暂停,便于观察参数(如路径)[^1][^4]。 - **在动态初始化函数中中断** 若需调试动态的初始化过程(如构造函数),可通过符号名设置断点: ```bash (gdb) break _init # 动态初始化函数 (gdb) break mylib_init_function # 自定义初始化函数 ``` --- #### 3. **运行程序并检查符号** - **启动程序并触发`dlopen`** 使用 `run` 命令运行程序,直到在`dlopen`处中断: ```bash (gdb) run ``` - **加载后验证动态符号** 在加载后,使用 `info sharedlibrary` 检查已加载的及其符号表状态: ```bash (gdb) info sharedlibrary ``` 输出会显示的地址范围和是否成功加载调试符号[^2]。 --- #### 4. **调试动态内部逻辑** - **在动态函数中设置断点** 若动态已加载符号,可直接在内函数设置断点: ```bash (gdb) break my_function_in_lib ``` - **单步跟踪与变量查看** 使用 `step` 进入函数内部,结合 `print` 查看变量值: ```bash (gdb) step (gdb) print variable_name ``` --- #### 5. **调试技巧与工具** - **使用`LD_DEBUG`辅助诊断** 通过环境变量 `LD_DEBUG` 输出加载的详细日志: ```bash LD_DEBUG=all ./main ``` 可查看搜索路径、符号解析等过程。 - **延迟加载调试** 若在运行时延迟加载,需在`dlopen`后重新检查符号并设置断点。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值