1. file : 查看应用程序类型,符号信息是否被stripped
2. readelf :查看elf文件 man readelf
Displays information about ELF files.
- -h:查看程序的入口地址
- -e:查看所有的段信息,包括-S信息
- -s:显示所有符号信息
- -r:查看需要重定位的符号信息
- -a:显示所有段信息以及符号信息
- wl:查看汇编指令地址所对应的源码文件和源码行号
- -w:–debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容
3. objdump:查看二进制文件信息
display information from object files.
- -D:反汇编所有段,其中-S功能类似。当-g选项打开时,-S的反汇编效果更优
- -R:查看需要重定义符号入口地址的存储位置
- -T:查看动态符号表入口
- 查看符号信息: objdump -s -j .gnu_debuglink codeMap/opt/nvme_zk/app/bin/db
4. nm:查看符号信息
list symbols from object files
- -a:查看全部的符号信息
5. gdb
- 调试:
- c语言单步调试:s/n;s - 发生函数调用时进入函数执行
- 汇编代码单步调试:si/ni;
- 程序执行输入参数:set args
- 多线程
- 查看全部线程栈帧:thread apply all bt
- 查看全部线程:info threads
- 切换线程: thread n
- 对指定线程下断点: b 行号|函数名 thread_id
- 只调试一个线程,其他线程stop:set scheduler-locking on/off
- 只stop住一个线程:set non-stop on
- 多进程
- 断点
新增:b 行号|函数名 {thread_id}
查看:info b
删除:d b_num
禁止断点:disable
使能断点:enable
临时断点:tbreak 行号|函数
条件断点:b 行号|函数名 condition
监视点:watch
断点命令列表:commands b_num
断点触发查看命令:display - 变量:打印变量,p var
- 按照格式打印内容:p /f var eg. p /x var
- 查看变量类型:ptype
- 查看数组:p *x@25
- 寄存器
- 查看寄存器:info registers
- 内存操作:
- 查看内存:x/xh address -> 十六进制打印出从address开始的4bytes的值
- 查看:x/<n/f/u> 个数/格式/大小
- 以二进制格式将内容加载到某地址中: restore context addr
- 将内存中内容dump到文件中:dump命令
- 修改内存:set addr context
- 查看函数的汇编代码:disas funcname
- disas /m 汇编和源码一起查看
- 查看源码:
- ctrl + x -> ctrl + a
- gdb main -tui
- 查看调用栈
- bt
- f n :跳转栈帧
- 查看全部线程栈帧:thread apply all bt
- 不中断程序的情况下,生成core文件:gdb -p ; generate-core-file ./main.core
- 查看maps文件
- info proc mappings
- 添加符号文件调试
- add-symbol-file file addr
- 对子进程进行debug
- set follow-fork-mode [parent|child]
- set detach-on-fork [on|off],停止对指定进程debug
6. addr2line:将汇编指令地址转换为[源码文件:源码行号]
- 实现原理:elf文件中有section,会维护一张汇编指令地址和行号的对应关系表
7. gcc
- nostartfiles
- nostdlib
8. objcopy