编译工具链及程序调试工具

目录
  1. 编译工具链
  2. 调试工具
    1. gdb
    2. addr2line
    3. c++filt

编译工具链

  • 编译:gcc g++ 常用
  • 链接:ld
  • 创建,修改和从归档文件中提取文件:ar
    1) 打包.o文件生成静态库:ar -crv libmylib.a *[obj1.o obj2.o]
    2) 查看静态库中的符号 ar -t libmylib.a
    3) 提取静态库中的文件 ar -x libmylib.a [file] (一般先用-t 选项看下要提取的文件名,然后进行提取)

  • 去掉符号表(debug info): strip, 去除后可以通过file命令查看,其用法如下:
    img
    想进一步看下strip做了什么,我们可以通过readelf -S file 查看下section head

  • 查看符号表:nm
  • 查看文件中的可打印字符串:strings
  • 查看堆栈地址对应的代码行:addr2line
  • 查看目标文件的信息:objdump
  • 拷贝和加工目标文件:objcopy
  • 查看ELF文件的信息:readelf —— 有点类似objdump,只适用于Executable and Linkable Format(可执行与可链接格式)

正常情况下,使用前三个工具就可以工程编译了

调试工具

gdb

这个工具就不介绍了,只言片语扯不清,可以参考用GDB调试程序 序列文章

addr2line

当程序出现core dump时,经常会打印出堆栈地址,这时侯可以根据该堆栈地址来查找程序中对应的出错行,使用方式如下:

1
addr2line -e filename addr

其中,filename为堆栈对应的库或者可执行文件(需要式no stripped形式的,否则结果会出现??), addr 为堆栈地址

c++filt

为了支持函数重载,c++引入了name mangle机制,将同名函数名称进行改编,来区分不同的函数。以c++中的find 函数来说,其存在多种重载形式,我们可以用下面的命令查看:

1
readelf -s /usr/lib64/libstdc++.so.6 |grep findE

其结果如下:
img1

然后用c++filt工具可以查看其对应的具体形式:

1
readelf -s /usr/lib64/libstdc++.so.6 |grep findE | awk '{print $NF}' |sed 's/@@.*$//g' | xargs c++filt

得到结果如下:
img2

本站总访问量