1、问题提出
当我们用python或c语言编写了一个linux系统下运行的程序,当该程序运行在后台且程序运行的结果不是我们预想的,比如采集不了设备的数据、或者是感觉程序运行暂停但是进程没有退出,尤其是在多线程的情况下,那我们有没有什么办法可以在程序运行的情况下且在不借助日志的情况下查看其大致运行状态呢?
我们想学习和分析一下linux系统下某个程序的实现思路,比如它调用了哪些系统API,那么我们有没有不用看源代码的简单的办法呢?
2、问题解决
这个问题答案当然是有的,linux系统下面有一项叫做ptrace的系统API,通过使用 ptrace(名称是“进程跟踪”的缩写),一个进程可以控制另一个进程,从而使控制器能够检查和操纵其目标的内部状态,ptrace 被调试器和其他代码分析工具使用,主要作为软件开发的辅助工具,linux系统下c/c++程序的调试工具GDB也是利用的ptrace系统API。
具体使用ptrace系统API调用的程序命令strace可以用于调试linux的进程,回答以上的问题。
比如跟踪一下ls命令的系统调用,可以输入命令 sudo strace ls,显示以下系统调用信息:
我们可以统计一下系统调用的API,命令为:sudo strace – c ls
比如,我们编写一个简单的python循环打印脚本:
运行该脚本:
假如这个脚本在后台运行,我们可以再打开一个终端,附加调试该脚本:
先获取该脚本进程ID号,执行以下命令:
查看该脚本进程的系统调用:sudo strace -f -p 355933 ,-p 为要调试附加的进程id, -f表示可以调试跟踪所有子进程,见下图,成功查看该进程的实时运行信息。
我们还可以过滤要看的系统调用,执行命令 sudo strace -e write -f -p 355933,如下图所示,成功捕获write系统调用即python的print函数:



