💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] > [参考](https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html) ## 概述 qdb 支持调试的语句 * Ada * Assembly * C * C++ * D * Fortran * Go * Objective-C * OpenCL * Modula-2 * Pascal * Rust ## 安装 ``` yum install gdb ``` ## 语法 ``` // 源码 list | l 出源码 l num 列出 num 行前后的源码 l fun 列出方法 fun 的源码 l start_num, end_num l file_name:fun_name set listsize count 设置一次显示多少行源码(默认为10) show listsize 显示listsize directiory dir_name | dir dir_name , 将指定的目录加入源码文件的前缀 show dir 显示目录前缀 // 断点和监视 break fun_name | b fun_name 在 fun_name 处打断点 b line_number 在 line_number 处打断点 b +offset 在offset 行后加断点 b -offset 同上 b file_name:fun_name 文件的方法名处打断点 b fine_name:line_number 同上 b *address 在某地址处打断点。适用于没有源码的情况 b line_number if condition 条件断点。 当条件为 true 时会中断 tbreak n tb n 单次命中断点。 如 tb 12 表示只会在第12行命中一次 // 监视 watch var 监视var变量 watch condition 带条件的监视。如 watch a>1 // 删除和禁用断点 clear 清除当前行的断点 clear fun_name 清除 fun_name 中的所有断点 clear line_number 删除该行的断点 delete d 删除所有的 breakpoints, watchpoints, or catchpoints. d num 删除序号为 num 的断点 d num1-num2 删除序号从 num1 到 num2 的所有断点 disable/enable num 禁用/启用序号为 num 的断点 disable/enable num1-num2 禁用/启用 序号从 num1到 num2 的断点 // 启动 run r continue c kill 杀掉当前调试的程序 quit q 退出 // 调试 run | r 运行程序 step | s 步进调试,可以进入方法 next | n 步进调试,不会进入方法 finish 跳出当前方法 until line-number 运行到 line-number 行 where 显示当前行数和方法 bt full 打印完整的栈信息 frame f 显示当前栈的 frame 信息 f number 选择frame up / down / up number /down number 选择 frame // 变量 print var 简写 p var 打印变量var p file_name:var p/x var 以16进制打印整型变量 。 p/d var 10进制 p/u var unsigned int p/o var 8进制 p/t var 2进制 (1byte/8bits) p/c var 以字符形式 p/f var 以 floating 形式 p/a var 以十六进制地址 x/4b &var 以 4 byte 打印var 的内存 ptype var 显示var 的类型 ptype date-type 显示原类型 // 信息 info args 列出参数 info breakpoints info break i b 列出所有断点 info break number i b number 列出序号为 number 的的断点 info watchpoints i watchpoints 列出所在 watchpoints info threads 列出所有线程 inifo registers 列出寄存器的值 info set 列出当前 gdb的所的设置 i frame i stack 列出堆栈信息 i locals // 列出当前变量 i catch // 多窗口 layout 用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法: layout src 显示源代码窗口 layout asm 显示汇编窗口 layout regs 显示源代码/汇编和寄存器窗口 layout split 显示源代码和汇编窗口 layout next 显示下一个layout layout prev 显示上一个layout Ctrl + L:刷新窗口 Ctrl + x,再按1: 单窗口模式,显示一个窗口 Ctrl + x,再按2: 双窗口模式,显示两个窗口 Ctrl + x,再按a: 回到传统模式,即退出layout,回到执行layout之前的调试窗口。 ``` ## 启动 方式一: `gdb <program>` 方式二: `gdb <program> <PID>` ## 示例 ### 查看可以源码调试 方式一: 没有源码调试 ``` > db main Reading symbols from /root/main...(no debugging symbols found)...done. ``` 有源码调试 ``` > db main Reading symbols from /root/main...done. ``` 方式二: 没有源码调试 ``` > readelf -S main|grep debug 没有输出 ``` 有源码调试 ``` > readelf -S main|grep debug [27] .debug_aranges PROGBITS 0000000000000000 00001059 [28] .debug_info PROGBITS 0000000000000000 00001089 [29] .debug_abbrev PROGBITS 0000000000000000 00001140 [30] .debug_line PROGBITS 0000000000000000 00001193 [31] .debug_str PROGBITS 0000000000000000 000011d7 ``` ### 简单调试 创建一个 main.c ``` #include <stdio.h> int main () { unsigned long long int n, sum; n = 1; sum = 0; while (n <= 100) { sum = sum + n; n = n + 1; } return 0; } ``` 编译 ``` gcc -o main -g main.c ``` > 注意编译需要加上 -g 才能用gdb 展示源码 ``` > gdb main > layout // 展示源码窗口 > l // 显示源码 > b n // 在第n行打断点 > r // 执行 ``` ## 调试正在运行程序CPU过高 ``` > gdb (gdb) > attach <PID> // 指定CPU过高的进程 (gdb) > info threads // 查看所有此程序的线程 (gdb) > thread <thread_number> // 查看指定线程 (gdb) > bt // 查看堆栈信息 ``` 使用 bt 分析进程,这是一个手动的过程,需要您多次观察程序并使用 GDB 分析,以找出性能问题。一旦确定了问题函数,您可以进一步分析该函数的代码,优化性能,或者使用性能分析工具来更深入地了解性能瓶颈。