一位同事曾告诉我,当Linux上的所有内容都无法调试时,最后一个选项是使用strace.
我试图学习这个奇怪工具背后的科学,但我不是系统管理大师,我没有真正得到结果.
所以,
简而言之,简单来说,这些东西是如何工作的?
这对于调试很有用(因此编程相关).在linux上,我们可以使用该命令
strace -feopen python myfile.py
Run Code Online (Sandbox Code Playgroud)
找出加载了哪些python模块和共享对象.macOS X上有一个等效的单行程吗?
我正在尝试使用strace来找出程序执行的命令execve.这些命令中的一些参数很长,并且strace缩写了execve(我在大约30个字符后看到"......")的参数,阻止我获取任何有用的信息.我怎样才能得到每个论点的全文?
我已经阅读了手册页.-v选项打印环境,这很有用,但参数仍然被截断.
strace -f -e trace=execve -v -p 1234
Run Code Online (Sandbox Code Playgroud)
我也试过传递verbose = all,但这只是提供了一些关于SIGCHLD的额外信息.
strace -f -e verbose=all trace=execve -v -p 1234
Run Code Online (Sandbox Code Playgroud) 我曾经strace简要地附上过程.该过程创建了90个线程.当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父母线程,等等一直到根进程.
有没有一个技巧或工具可以快速找出哪个线程创建了另一个?或者更好的是,打印线程创建树pstree如何?
OS X缺少linux strace,但它dtrace本来应该是更好的.
但是,我错过了对单个命令进行简单跟踪的功能.例如,在linux上我可以写入strace -f gcc hello.ccaputre所有系统调用,它给出了编译器编译程序所需的所有文件名列表(优秀的memoize脚本是基于这个技巧)
我想在mac上移植memoize,所以我需要一些strace.我真正需要的是gcc读取和写入文件的列表,所以我需要的更多是一个truss.我当然可以说dtruss -f gcc hello.c并获得一些相同的功能,但随后编译器运行root权限,这显然是不可取的(除了大量的安全风险,一个问题是该a.out文件现在由root拥有:-)
然后我尝试了dtruss -f sudo -u myusername gcc hello.c,但这感觉有点不对,并且无论如何都不起作用(a.out这次我得不到文件,不知道为什么)
所有长篇故事都试图激发我的原始问题:如何dtrace使用普通用户权限运行我的命令,就像strace在linux中一样?
编辑:似乎我不是唯一一个想知道如何做到这一点:问题#1204256与我的几乎相同(并且具有相同的次优sudo答案:-)
我正在尝试使用gdb附加程序,但它返回给我:
附加到进程29139无法附加到进程.如果您的uid与目标进程的uid匹配,请检查/ proc/sys/kernel/yama/ptrace_scope的设置,或以root用户身份再次尝试.有关更多详细信息,请参阅/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作.
edb-debugger返回"无法附加到进程,请检查权限,然后重试."
strace返回"attach:ptrace(PTRACE_ATTACH,...):不允许操作"
我将"kernel.yama.ptrace_scope"1更改为0并将"/ proc/sys/kernel/yama/ptrace_scope"1更改为0并尝试使用以下方法设置"set environment LD_PRELOAD =./ ptrace.so":
#include <stdio.h>
int ptrace(int i, int j, int k, int l) {
printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它仍然返回相同的错误.我如何将它附加到调试器?
我想跟踪find命令发出的系统调用来调试一些性能问题但是我无法弄清楚如何在Mac OS X Yosemite上执行此操作.我如何跟踪任意程序的系统调用,类似于FreeBSD上的strace?我对跟踪文件系统相关的调用特别感兴趣.
我知道strace使用ptrace做的工作,
但它需要运行目标进程TRACE_ME,
不适用于已经运行的流程的情况.
它如何在已经运行的进程上工作?
如果我想要一个多线程进程(所有线程),我应该怎么做?
我知道可以做strace -f跟随分叉进程吗?但是当我开始打算时,如何附加到已经是多线程的进程呢?是一种告诉strace跟踪属于该进程的所有线程的所有系统调用的方法吗?