gdb使用
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb使用相关的知识,希望对你有一定的参考价值。
前言
- 在工作中,无论是学习代码流程还是问题的定位,GDB都显得尤为重要,多掌握一些命令可以提升我们的效率和解决问题的能力;
- 按照我的理解,对GDB的掌握程度可以分为三种人:
- 基础命令,大家都知道
- 相对高阶一点的,少数人了解,掌握之后可以提升调试解决问题的效率
- 需要结合反汇编、栈回溯、malloc内存分配原理和结构、elf文件结构等知道,配合GDB来解决一些内存相关的偶现问题
本文主要是对前面两部分内存进行描述,最后部分会在其他专题展开描述。
1、GDB基础介绍
1.1简介
- gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具
- gdb除支持c/c++语言外还支持go、D、object-c、fortran等语言
- GDB主要帮助你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
1.2编译
这块不是我们的重点,而且网上资料很多,不做展开
2、GDB的使用
2.1使用方式
2.1.1本地调试
直接在服务器或者当前嵌入式设备环境下运行,如果gdb程序为gdb,应用程序为build,则运行调试使用命令如下:
~#gdb ./build
2.1.2远程调试
远程调试需要两个GDB程序,运行在远程设备(target)上的程序称之为gdbserver,运行在本地主机host上的gdb程序为交叉编译器,即在x86平台上运行arm平台的gdb程序,记作gdb_client
1、嵌入式设备执行:
~#./gdbserver 192.168.10.2:1234 ./build
其中192.168.10.2表示允许从这个IP地址登录道嵌入式设备,一般我们的PC服务器地址,也尅省略,表示允许从任何IP连入,:1234为端口号,build为即将调试的应用程序。
2、PC端执行:
~#arm-linux-gdb ./build_Debug
handle SIGPIPE SIGUSR2 SIG32 nostop noprint
target remote 172.8.4.11:1234 //与服务端建立关联
其中172.8.4.11为当前嵌入式设备的IP地址,:1234位端口,必须与嵌入式设备运行时指定的端口一直,两者均为必填项,不能省略。
注:
- 设备端无需输入build_Debug ,否则加载会非常慢
- 由于设备端内存等的原因,一般情况下我们都是使用远程调试
2.1.3attach
在实际的交叉编译开发过程中,在某些时候我们运行程序时没有加载gdb,但是却发现了一个偶现问题,需要gdb来定位,这个时候就需要去attach分析。
1、找到当前可执行程序对应的debug版本
2、ps,查看当前可执行程序的进程号
3、设备端执行
./gdbserver 192.168.10.2:1234 --attach 669 (669是进程pid)
4、PC端:
~#arm-linux-gdb ./build_Debug
handle SIGPIPE SIGUSR2 SIG32 nostop noprint
target remote 172.8.4.11:1234
5、detach可退出gdb(退出之后程序正常运行)
2.1.4core分析
core文件是死机之后为了还原现场进行分析而生成的,后面会详细介绍,这里只是介绍一下core文件的解析:
~#arm-linux-gdb ./build_debug ./core.669
加载成功之后,可以直接bt查看到当前死机的线程,对core文件进行分析。
注:
- core生成的可执行程序要和core解析时使用的debug版本的可执行程序对应,否则会解析异常
- core加载有很多问号,需要指定一下动态库的路径
set solib-search-path ./libso/
set solib-absolute ./libso/
以上是关于gdb使用的主要内容,如果未能解决你的问题,请参考以下文章