问题标签 [dtruss]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
118 浏览

ios - 跟踪 iPhone 模拟器以加快启动时间

iPhone Simulator 需要几分钟才能启动,因此我正在跟踪系统调用的经过时间以加快启动时间:

我发现了两个特别慢的系统调用:

请注意,select()系统调用占用了 104 段并最终失败,因此发现与此调用关联的文件路径会很有帮助。

我怎样才能找到这个文件?

0 投票
0 回答
31 浏览

linux - 查找和使用系统调用

我正在 linux 和 OSX 上开发一个应用程序,我需要查看邻居缓存(ipv6)并添加 ips。例如,我可以通过简单地使用“ndp -an”和“ifconfig...”命令来做到这一点,但它似乎相当不优雅。

我尝试使用“dtruss”来分析进行了哪些系统调用,但我真的不知道从诸如“__sysctl(0x7FFF53BA62D0, 0x6, 0x0)”之类的信息中去哪里。

关于在哪里看以及我应该如何进行的任何提示?

0 投票
2 回答
118 浏览

git - 如何使 git log 的底层文件访问操作可见

我想可视化由运行类似git lg -n3. 我在 Mac 上。所以我想,好吧,让我们跑吧dtruss git lg -n3

不幸的是,这并没有给我预期的输出。我希望看到对某些文件的文件访问.git/objects

不是dtruss我要找的吗?

我应该补充一点,我也没有看到git log运行它时的输出dtruss。如果我运行,dtruss git我至少会看到 git 命令概述的输出。我做错了吗?

更新

好的,事实证明这是 dtruss 如何处理多字命令的问题git log。如果我使用dtruss /usr/local/git/libexec/git-core/git-log它按预期工作。

我可以走得更远,跑得更远dtruss /usr/local/git/libexec/git-core/git-log -n3 2>&1 | grep access,得到我想要的东西。所以剩下的唯一问题就是为什么我必须使用完整路径git-log而不仅仅是git log命令。

0 投票
0 回答
241 浏览

java - dtruss 是否缺少呼叫?

问题

我正在尝试诊断在 Mac 上使用 JCEF 启动应用程序的问题,并且它的跟踪似乎dtruss缺少系统调用。例如,程序总是在查找 'icudtl.dat' 失败后退出,并打印出如下日志消息:

然而,我只是偶尔在 dtruss 跟踪中看到相应的写入调用。而且我从未设法捕捉到它实际上正在寻找“icudtl.dat”。dtruss 是否有可能漏接电话?如果是这样,我该如何解决?

细节

像这样运行 dtruss:

在跟踪中,我看到以下内容:

然后很久以后写入实际上被捕获:

但是根本没有提到它试图查找“icudtl.dat”。虽然捕获了许多其他文件 IO 操作。

0 投票
3 回答
452 浏览

node.js - 为项目全局设置 node_modules 位置

如果我写

在我的项目中,Node 浪费了大量时间来查找实际上不包含该文件的位置,如此dtruss输出所示。

有没有办法让 Node 不会在不包含目录的地方浪费太多时间node_modules?就像,我可以设置某种CHECK_HERE_FIRST=$HOME/code/api/node_modules环境变量,如果需要的不是相对路径,那将是 Node 检查的第一个地方。

我可以更改所有require行以加载相对导入,但这对于大型项目来说似乎很麻烦。

0 投票
1 回答
2434 浏览

macos - 如何在 Mac OS X 上获得 dtruss 以成功跟踪子进程?

dtruss手册页说:

这听起来正是我想要的。但是,请注意以下行为:

请注意,除了第一种情况,不打印“hello world”。(这不仅仅是看不到输出的问题;如果我运行一个需要很长时间的过程,在sh -c类似情况下它不会花费任何时间。在我所做的所有实验中,它似乎执行只是在第一个停止exec。)

所以,我很困惑到底做了什么dtruss -f。我怎样才能让它像strace -f在 Linux 上一样运行,它可以满足我的需求?

动机:我正在 OS X 上进行一些 Haskell 开发,并想跟踪运行期间发生的情况cabal(Haskell 的构建系统)。在 cabal 上运行dtruss -f什么都不做就返回了,因为在 OS X 版本的 Haskell 平台中,/usr/bin/cabal是一个 shell 脚本,它exec是 s /Library/Haskell/bin/cabal.real。当然,我可以通过直接运行来解决这个问题/Library/Haskell/bin/cabal.real,但这仍然对我没有多大帮助,因为cabal.real只是要转身和exec一堆其他东西。(想想make如果你不熟悉 Haskell。)

0 投票
2 回答
73947 浏览

macos - 如何在 Mac OS X 中跟踪程序的系统调用?

我想跟踪find命令进行的系统调用以调试一些性能问题,但是我不知道如何在 Mac OS X Yosemite 上执行此操作。我如何跟踪任意程序的系统调用,类似于strace在 FreeBSD 上的作用?我对跟踪文件系统相关调用特别感兴趣。

0 投票
1 回答
223 浏览

c - 检测进程使用/修改/创建/删除哪些文件的最佳方法是什么?

我想编写能够在进程(及其子进程)执行期间检测所有使用/创建/修改/删除的文件的软件。该进程还没有运行——用户提供了一个命令行,稍后将通过 bash 对其进行子处理,因此我们可以在执行之前和之后做一些事情,并控制命令运行的环境。

到目前为止,我已经想到了四种可能有用的方法:

  • 解析命令行以识别提到的文件和目录。假设使用了所有明确提到的文件。检查创建/删除文件之前/之后的目录。MD5 现有文件之前/之后看到任何被修改。这适用于所有操作系统和环境,但显然有严重的限制(当命令是“./script.sh”时不起作用)
  • 通过另一个进程运行该进程,例如 strace(用于 OSX 的 dtruss,并且有等效的 windows 程序),它侦听系统调用。解析输出文件以查找使用/修改/删除/创建的文件。优点是它比 MD5 方法更敏感,并且可以处理 script.sh。缺点是它非常特定于操作系统(dtruss 需要 root 权限,即使正在运行的进程不需要 - 工具的输出都不同)。如果有很多读/写操作,也可能会创建巨大的日志文件,并且肯定会减慢速度。
  • 将与上述类似的东西集成到内核中。显然仍然是特定于操作系统的,但至少现在我们正在发号施令,为所有操作系统创建通用输出格式。不会创建巨大的日志文件,甚至可以在进程向文件请求第一个 read() 之后停止将系统调用挂钩到 read()。我认为这就是 inotify 工具正在做的事情,但我根本不熟悉它,也不熟悉内核编程!
  • 使用 LD_PRELOAD 技巧运行进程(在 OSX 上称为 DYLD_INSERT_LIBRARIES,不确定它是否存在于 Windows 中),它基本上用我们自己的 open() 版本覆盖进程对 open() 的任何调用,该版本记录我们正在打开的内容。写入、读取等也是如此。它做起来非常简单,而且性能非常好,因为您本质上是在教进程记录自己。缺点是它只适用于动态链接的过程,我不知道动态/静态链接程序的普遍性。我什至不知道在执行之前是否有可能判断一个进程是动态链接还是静态链接(目的是默认使用此方法,但如果不可能,则退回到性能较差的方法)。

我需要帮助选择最佳路径。我已经实现了第一种方法,因为它很简单,并且为我提供了一种在日志后端 ( http://ac.gt/log ) 上工作的方法,但我确实需要升级到其他方法之一。你的建议将是无价的:)

0 投票
1 回答
468 浏览

macos - OSX:dtrace printf()、write_nocancel() 输出基于 dtruss 脚本

我需要看到我的程序的 printf 输出与 dtrace 输出同步。

我喜欢构建我自己的 dtrace 命令版本,它产生“ sudo dtruss -t write_nocancel ls ”命令的等效输出。

这是“正确的 dtruss 命令/输出”:

基于查看 dtruss 脚本源代码,我尝试了这个 dtrace 命令,但它失败了。

那里的任何 dtrace 专家都可能对如何解决这个问题有所了解?

0 投票
2 回答
3001 浏览

macos - dtruss 在 OS X 10.11 上的 ps 上失败

我试图查看哪个系统调用ps用于获取 OS X 10.11(El Capitan)上进程的命令行,并遇到以下错误:

谷歌搜索导致建议制作副本ps可以让我绕过这个,但这对我不起作用。为什么我不能再dtruss在任意二进制文件上运行,有什么办法可以恢复旧的行为?