GDB调试技巧与多线程调试指南

需积分: 10 1 下载量 72 浏览量 更新于2024-09-09 收藏 76KB PDF 举报
"这篇文档分享了关于GDB(GNU调试器)的一些知识,包括如何启动调试、检查共享库、多线程调试、处理死锁、启用符号、查看调用约定、远程调试以及如何查看STL容器等内容。" GDB是GNU项目的一个组件,是一个强大的源代码级调试器,用于C、C++等语言。以下是一些关键知识点的详细说明: 1. **启动调试**: - 使用`LD_LIBRARY_PATH`环境变量和`--args`选项可以指定非默认的共享库路径,例如`LD_LIBRARY_PATH=../.. gdb --args <可执行文件> <参数>`。 - 如果遇到`-Wl,-rpath`异常,可能是因为链接时设置了运行时搜索路径,可以尝试用`chrpath`工具来修改或删除动态链接器的搜索路径。 2. **检查共享库**: - `info sharedlibrary`命令用于显示当前进程加载的所有共享库信息。 - `set so-search-path`或`set sysroot`可以改变GDB查找共享库的路径。 3. **多线程调试**: - `info thread`列出所有线程的信息。 - `thread <TID>`切换到指定线程ID。 - `thread apply all bt`在所有线程上打印堆栈回溯,这对于分析多线程程序的死锁问题非常有用。 4. **处理死锁**: - `gdb-p <PID>`附加到已运行的进程(PID为进程ID),可用于调试已经死锁的程序。 - 通过`thread apply all bt`找出哪个线程处于哪个函数,帮助识别死锁的原因。 5. **启用符号**: - 编译时使用`-g`选项启用调试信息,防止运行`strip`移除这些信息。 - 当没有符号可用时,可以通过`thread <TID>`定位线程,`frame <FID>`选择栈帧,并使用`disassemble`查看汇编代码。 6. **调用约定**: - 不同架构有不同的参数传递方式,如在ARM中,通常使用r0到r3寄存器传递前四个参数,返回值通常在r0中;而在x86_64架构,参数通常通过rdi, rsi, rdx, rcx, r8, r9传递,返回值在rax中。 - `info registers`可以查看当前寄存器的值。 7. **远程调试**: GDB支持远程调试,允许你在一台机器上调试运行在另一台机器上的程序,这对于分布式系统或者嵌入式设备的调试非常有用。 8. **查看STL容器**: 通过导入GDB脚本,如`source /stl-views-1.0.3.gdb`,可以方便地查看和操作STL容器,如`pvector`和`pmap`命令。 9. **自定义GDB提示符**: GDB允许用户修改提示符,以提供更个性化的交互体验。 以上是GDB调试器的关键使用技巧和功能,熟练掌握这些知识点能够极大地提高调试效率,解决各种编程问题。