文件分析工具大全

https://www.163.com/dy/article/FBVCGUNI0511CPOJ.html

  • file
    确定文件类型

  • hexdump
    以 ASCII、十进制、十六进制或八进制显示文件内容。

  • ldd
    查看依赖库

  • strings
    打印文件中的可打印字符的字符串。
    在开发软件的时候,各种文本/ASCII 信息会被添加到其中,比如打印信息、调试信息、帮助信息、错误等。只要这些信息都存在于二进制文件中,就可以用 命令将其转储到屏幕上。

  • readelf (android ndk)
    读取efl规范信息

查看依赖库:
readelf -d your_binary_file | grep NEEDED

  • objdump

查看堆栈信息

1.nm

https://zhuanlan.zhihu.com/p/363014233
列出对象中的符号
如果你所使用的二进制文件没有被剥离, 命令将为你提供在编译过程中嵌入到二进制文件中的有价值的信息。 可以帮助你从二进制文件中识别变量和函数。你可以想象一下,如果你无法访问二进制文件的源代码时,这将是多么有用。

2.gdb

第1步:进入gdb
gdb your_program
第2步:run your_program
输入run
第3步:打印所有线程的堆栈信息(会显示行号)
输入bt或thread apply all bt
这一步,如何程序异常崩溃会中断定位到报错行,继续输入c则继续运行。

3.addr2line

将地址转换为文件名和行号。给定可执行文件中的地址或可重定位对象部分中的偏移量,它会使用调试信息来确定与之相关的文件名和行数。
https://blog.csdn.net/qq_43416206/article/details/131405806
https://blog.csdn.net/u013357557/article/details/127784910
https://linuxcommand.p2hp.com/addr2line
https://www.jianshu.com/p/c2e2b8f8ea0d
https://blog.csdn.net/ZHI11235813/article/details/128588157

  • 使用示例

    addr2line -e 执行程序 异常堆栈地址
    例如:
    addr2line -e aarch_backtrace_demo 0x400f48
    /home/share/mypro/myDemo/Backtrace/main.cpp:119 (函数报错文件名, 行号)
  • 导出程序的映射文件

gcc 的 -Map 参数用于生成一个映射文件(map file),该文件包含了程序中各个函数的信息,以及内存的分配信息等。映射文件可以帮助开发者理解链接后的程序内存布局,以及调试信息的处理。使用 -Map=filename.map 可以指定生成映射文件的名称。如果不指定文件名,默认映射文件名为 output.map,其中 output 是编译器生成的可执行文件或目标文件名。
例如,编译一个名为 example.c 的C程序并生成映射文件:
gcc -o example example.c -Map=example.map
这将生成一个名为 example.map 的映射文件。
映射文件中包含的内容会根据编译选项的不同而有所差异,但通常会包括以下信息:

符号定义和引用

数据段和代码段的内存分配

编译单元之间的依赖关系

源代码的行号信息(如果使用了调试信息 -g)

映射文件对于程序的优化、调试和问题排查都非常有帮助。

我的情况
使用-Map生成的地址,利用addr2line能正常显示代码行号,但是利用backtrace与backtrace_symbols生成的地址显示??
https://blog.csdn.net/jinking01/article/details/126564672
最终发现要使用[bt] #1 /home/xinyi/code/cplus/cpp-all-demo/cmake-build-debug/stack2(+0x14a6) [0x56112f6294a6]圆括号里的地址,而非中括号里的地址。

查看程序堆栈信息函数

backtrace与backtrace_symbols
https://zhuanlan.zhihu.com/p/402457116?utm_id=0
https://blog.csdn.net/joshua0137/article/details/123658865


0 条评论

发表回复

您的电子邮箱地址不会被公开。