• Linux/Windows 实用工具简记


    以下只是开发中可能用的比较多的工具,另外还有其他很多未曾提及的实用工具。
    Linux篇:

      1.链接过程的调试:主要用于查看构建过程;如链接时加载的动态库以及运行时加载动态库过程的调试
        支持LD_DEBUG环境变量(glibc下提供给加载器便于调试的一个环境变量);
        常用的使用方法:
          LD_DEBUG=help XXX XXX可为任意字符串,即可调出帮助信息;
          LD_DEBUG=libs xxx xxx为可执行二进制文件,显示所依赖库的文件路径;
        此外还可以显示重定位、符号表、依赖库版本匹配信息等;
        对于LD_DEBUG环境变量,可以在调用链接器命令时使用,也可以在当前终端的shell下设置环境变量如export LD_DEBUG=option;或者是在系统的环境变量下设置(不建议采用)。
      2. 二进制文件类型
        1)file程序查看,如:file XXX;
        2)readelf分析ELF头信息,如:readelf -h XXX ;其中类型:EXEC DYN REL 分别为可执行文件、共享目标文件、可重定位文件(如.a/.o文件);
        3)objdump分析ELF头信息,同readelf类似,其中类型:EXEC_P DYNAMIC 分别为可执行文件、共享目标文件,对于目标文件没有显示类型信息。
      3. 二进制文件入口点
        1)可执行文件的入口点
          readelf -h XXX
          或objdump -f XXX 。
        2)动态库的入口点
          对于静态加载的动态库,一般可通过gdb调试,打断点进而确定加载的动态库入口点具体位置;
          对于动态加载的动态库,则只能在方法中将大量屏幕输出重定向进行查询。
      4. 查看导出符号列表信息
        1) nm 程序
        2) readelf程序
        3) objdump程序
        具体的查询选项可查看各工具程序-help或--help选项。
      5. 查看符号节、段的信息
        1) readelf程序
        2) objdump程序
        具体的查询选项可查看各工具程序-help或--help选项。
      6. 反汇编
        1) 反汇编二进制:objdump -d/-D选项。
        2) 反汇编运行的进程:gdb调试器
      7. 查看可执行文件或者共享库加载时依赖的共享列表
        1) ldd程序可查看完整依赖列表(含直接依赖库以及依赖库的依赖库(或者更多间接依赖库))
        2) objdump -p或readelf -d的动态节信息
      8. 查看装载器可找到的有效库文件:ldd -p
      9. 查看运行时加载的动态库链接文件:
        1) strace程序 跟踪系统调用,如:strace -f -e open cat,即查看cat程序的open系统调用;
        2) LD_DEBUG环境变量,如LD_DEBUG=files选项,如:LD_DEBUG=files gdb -q XXX;通过gdb调试打断点以使得程序XXX执行中暂停,此时可以显示携带的信息,

          另外也可以在以进程PID下的/proc/PID/maps文件中,可查看被记录加载的动态库文件;
        3) lsof程序,可查看静态或者动态加载的动态库,此外其还可以查看普通文件、套接字、库文件、设备文件等打开的情况。
      10. 静态库创建和其他操作:ar归档工具,可实现目标文件打包成静态库,另外还有添加、替换、删除、提取、调整顺序等操作

    Windows篇:
      1. 库管理器lib.exe
        类似于Linux的ar归档工具,此外还可以创建动态库引入库文件以及解析循环依赖的exp导出库文件;
        1) 创建静态库文件: lib.exe /OUT:XXX.lib /NOLOGO x.obj y.obj z.obj ...等
        2) 此外列出、删除、提取操作分别以/LIST /REMOVE /EXTRACT,追加操作lib.exe XXX.lib abc.obj
        3) 创建动态库导入库(引入库),如通过def模块定义文件创建引入库lib:lib.exe /machine:x64 /def:XXX.def /out:XXX.lib
        4) 事实上除了lib可以创建动态库引入库外,还可以直接通到dll文件来导出,如 dumpbin /exports XXX.dll > XXX.def
      2. PE/COFF文件格式信息查看工具dumpbin.exe
        类似于Linux的objdump工具,其可查看导出符合、节信息、反汇编信息以及可查看静态库中的目标文件等,具体使用可查看各个选项,
        如:/EXPORTS 查看导出函数 /IMPORTS 查看加载时依赖项,依赖库和符号列表 /HEADERS 查看节信息 /SECTION查看特定节信息 /DISASM查看反汇编信息。

        如果查看a.dll库中包含哪些函数,可以使用:dumpbin /exports a.dll >1.txt

        如果查看b.exe中加载了哪些动态库,可以使用:dumpbin /imports b.exe >2.txt

        如果查看c.lib中包含哪些函数,可以使用:dumpbin /all /rawdata:none c.lib >3.txt

        如果查看d.obj中包含哪些函数,可以使用:dumpbin /all /rawdata:none d.obj >4.txt

      3. PE模块依赖分析工具Dependency walker(depends.exe)
        类似于Linux的ldd工具,可查看库或应用程序依赖关系以及导入、导出函数等,部分应用程序运行异常,可通过此工具查看缺少的依赖库;
        有时候该工具都找到并添加相应依赖库后仍然运行异常,则可结合sxstrace,查看是否缺少或是不匹配的清单文件,或者是其他错误提示信息。

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/haomiao/p/6442507.html
Copyright © 2020-2023  润新知