zoukankan      html  css  js  c++  java
  • 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,查看是否缺少或是不匹配的清单文件,或者是其他错误提示信息。

  • 相关阅读:
    201521123003《Java程序设计》第12周学习总结
    软工网络15团队作业8——敏捷冲刺日志的集合贴(Beta阶段)
    软工网络15团队作业4——敏捷冲刺日志的集合贴(Alpha阶段)
    beta版验收互评
    软工网络15团队作业8——Beta阶段敏捷冲刺(用户使用调查报告)
    软工网络15团队作业9——项目验收与总结
    团队作业5——测试与发布(alpha阶段)
    软工网络15团队作业8——Beta阶段敏捷冲刺(Day6)
    软工网络15团队作业8——Beta阶段敏捷冲刺(Day5)
    软工网络15团队作业8——Beta阶段敏捷冲刺(Day4)
  • 原文地址:https://www.cnblogs.com/haomiao/p/6442507.html
Copyright © 2011-2022 走看看