反编译linux内核_Linux 后台开发常用调试工具

本文详细介绍了Linux后台开发过程中常用的调试工具,包括编译阶段的nm、strings、strip、readelf、addr2line,运行阶段的ldd、strace、ltrace、time、gprof、valgrind和mtrace,以及其他如proc文件系统和系统日志的利用。这些工具在检查内存错误、性能分析、动态库依赖等方面发挥重要作用,是提升开发效率和解决故障的关键。
摘要由CSDN通过智能技术生成

0081f0735f7857e68c1d1bd91a9ac31b.png

01 总览

编译阶段

  • nm 获取二进制文件包含的符号信息
  • strings 获取二进制文件包含的字符串常量
  • strip 去除二进制文件包含的符号
  • readelf 显示目标文件详细信息
  • objdump 尽可能反汇编出源代码
  • addr2line 根据地址查找代码行

运行阶段

  • gdb 强大的调试工具
  • ldd 显示程序需要使用的动态库和实际使用的动态库
  • strace 跟踪程序当前的系统调用
  • ltrace 跟踪程序当前的库函数
  • time 查看程序执行时间、用户态时间、内核态时间
  • gprof 显示用户态各函数执行时间
  • valgrind 检查内存错误
  • mtrace 检查内存错误

其他

  • proc文件系统
  • 系统日志

02 编译阶段

nm(获取二进制文件里面包含的符号)

符号:函数、变量

参数:

  • -C 把C++函数签名转为可读形式
  • -A 列出符号名的时候同时显示来自于哪个文件。
  • -a 列出所有符号(这将会把调试符号也列出来。默认状态下调试符号不会被列出)
  • -l 列出符号在源代码中对应的行号(指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空)
  • -n 根据符号的地址来排序(默认是按符号名称的字母顺序排序的)
  • -u 只列出未定义符号

strings(获取二进制文件里面的字符串常量)

功能:

获取二进制文件里面的字符串常量

用途:

比较重要的是检查KEY泄露

eg:strings <your_proc> | grep '^.{16}$'

查找<your_proc>中是否存在一行有16个字符的行,并显示出来。

选项:

  • -a 不只是扫描目标文件初始化和装载段, 而是扫描整个文件。
  • -f 在显示字符串之前先显示文件名。
  • -n min-len打印至少min-len字符长的字符串.默认的是4。
#strings /lib/tls/libc.so.6 | grep GLIBC
GLIBC_2.0
GLIBC_2.1
GLIBC_2.1.1……

这样就能看到glibc支持的版本。

strip(去除二进制文件里面包含的符号)

用途:

可执行程序减肥(通常只在已经调试和测试过的生成模块上,因为不能调试了)

反编译、反跟踪

readelf(显示目标文件详细信息)

nm 程序可用于列举符号及其类型和值,但是,要更仔细地研究目标文件中这些命名段的内容,需要使用功能更强大的工具。其中两种功能强大的工具是objdump和readelf。

readelf工具使用来显示一个或多个ELF格式文件信息的GNU工具。使用不同的参数可以查看ELF文件不同的的信息。

readelf <option> <elffile>

  • -a 显示所有ELF文件的信息
  • -h 显示ELF文件的文件头
  • -l 显示程序头(program-header)和程序段(segment)和段下面的节
  • -S 显示较为详细的节信息(section)
  • -s 显示符号信息,
  • -n 显示标识信息(如果有)
  • -r 显示重定位信息(如果有)
  • -u 显示展开函数信息(如果有)
  • -d 显示动态节信息,一般是动态库的信息

objdump(尽可能反汇编出源代码)objdump –S <exe>

尽可能反汇编出源代码,尤其当编译的时候指定了-g参数时,效果比较明显。

addr2line(根据地址查找代码行)

当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值