• linux下程序分析工具总结


    最近分析阿三做的一个数据库备份产品 NetVault,学了几招,下面进行一次汇总。

     1、首先需要想办法让自己想要分析的进行尽可能的长时间运行,比如对于这个程序,我在数据库中生产大量的数据,并使用NetVault进行备份,使其备份进程可以长时间的运行。

    2、使用 top 工具查看当前正在运行的进程。因为备份组件在备份过程中会消耗大量的系统资源,所以需要格外注意 top 输出结果最上面的几个进程,特别是突然出现的备份进程。

    3、在使用 top 的过程中还可以同时使用 iotop 查看当前进行 io 操作的进程。

            一个小技巧,如果来不及查看界面数据,可以将输出结果重定向到文件中。

            例如 iotop >> res.txt

    4、使用 dstat 工具也可以查看系统的各项资源详细使用情况(CPU、内存、磁盘、网络、IO等)

    5、明确了具体的进程后,记录 PID,之后使用 lsof -p [pid] 可以查看该进程运行过程中使用的文件。

     6、如果需要具体的监控某一个文件会被哪些进程使用,可以使用 fuser。例如 "fuser -uv .”可以监控当前文件夹,“fuser -uv libssl.so”可以监控具体的文件,当然使用 "lsof | grep libssl.so" 也可以。

    7、如果需要查看进程的堆栈(函数调用逻辑),可以使用 pstack [pid] 进程查看,也可以使用 gdb。需要注意的时,这种方法获取的结果也是进程运行的瞬时的堆栈状态,可以在进程的运行过程中多打印几次

    8、确认了程序执行组件后,可以通过 nm 查看程序使用的符号,如函数名、变量等,以及这些符号存储的区域。

    9、更进一步的可以使用 gdb attach [pid] 对进程进行调试,打断点运行或者打印堆栈信息等。不过需要选择合适的时机,因为进程的运行状态是转瞬即逝的,可以先使用 nm 查看进程包含了哪些调用函数,如果这些函数是在公共库(提供了源码),可以修改源码中对应的函数(例如,休眠一段时间),之后重新编译出动态库,替换掉进程依赖的动态库。这样由于增加了休眠,gdb就可以attach 住该进程,进行调试了。

  • 相关阅读:
    入门力扣自学笔记72 C++ (题目编号515)
    Spring Cloud Feign
    系统架构师备考倒计时24天(每日知识点)
    Leetcode—2609.最长平衡子字符串【简单】
    day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和
    主流开发语言和开发环境?
    如何使用http来获取thingsbord中的设备数据
    初识nuxt3
    差点跳起来了! 全靠这份“Java 核心知识笔记”我成功拿到美团 offer
    记一次因 lru_cache 导致的 Python 内存泄露排查
  • 原文地址:https://blog.csdn.net/qq_37437983/article/details/126005481