15513各种工具使用小结

1. objdump

  • objdump -t: 打印符号表
  • objdump -d: 反编译

2. valgrind

2.1. 使用的命令

1
2
3
4
5
$ valgrind --leak-resolution=high \
           --leak-check=full \
           --show-reachable=yes \
           --track-fds=yes \
           ./myProgram arg1 arg2

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
  • 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 call
    • down 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
2
3
pushq $0xabcdef # Push value onto stack
addq $17,%rax # Add 17 to %rax
movl %eax,%edx # Copy lower 32 bits to %edx

可以使用

1
2
$unix gcc -c example.s
$unix objdump -d example.o > example.d

生成的example.d的结果为

1
2
3
4
5
6
example.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <.text>:
0: 68 ef cd ab 00 pushq $0xabcdef
5: 48 83 c0 11 add $0x11,%rax
9: 89 c2 mov %eax,%edx

起始地址: 字节序列

Clang静态分析器

Clang静态分析器可以用于在编译期定位一些错误

[path-to-llvm]/bin/scan-build make