1. objdump
objdump -t
: 打印符号表objdump -d
: 反编译
2. valgrind
2.1. 使用的命令
1 |
|
2.2. valgrind能够检测的错误类型
- 读写已经释放的内存
- 内存泄漏
- still reachable: 内存块和指向内存块的指针仍然存在
- definitely lost: 不存在指向内存块的指针
- indirectly lost: 指向内存块的指针无法找到
- possibly lost: 指针仍然存在,但是指针仅指向内存块的一块内部区域
3. GDB
layout src/split
(刷新布局)i f(info frame)
显示当前进程stack信息i r eip ebp esp
打印寄存器信息- printing values
- print [any valid expression]
p *pntr
p *(struct_t*) tmp
- print [any valid expression]
- inspecting memory
x/nfu [memory address]
: 等价于print *(addr)
- n: next n units of memory
- f: format
- d(decimal), x(hexadecimal), s(string)
- u: unit
- b(bytes), h(halfword/16 bits), w(words/4 bytes), g(giant word word/ 64 bits)
- x/nxw addr: 打印自addr开始的n个16进制word
- x &var: 默认打印var对应地址开始4字节的值,以16进制显示,注意x86是小端法,显示时末位字节存在低地址处
- x $ebp: 打印$ebp 内值(指向前一个ebp在栈中位置的指针):$ebp值指向的值即前一个ebp的值
- x/i: 以指令形式打印,可用于二进制文件的反汇编分析
- finish(f): 运行直至当前函数结束
- backtrace
bt
up N (u N)
: go up N function calldown N (d N)
: go down N function call
- watch point
watch foo
watch \*(int \*)0x600850
- 输入重定向:r < foo.txt
- 在gdb中执行shell命令,例shell ls
3.1. 生成指令序列的字节码
使用GCC作为汇编器,OBJDUMP作为反汇编器。例如对于汇编文件example.s
1 |
|
可以使用
1 |
|
生成的example.d的结果为
1 |
|
起始地址: 字节序列
Clang静态分析器
Clang静态分析器可以用于在编译期定位一些错误
[path-to-llvm]/bin/scan-build make