标签: strace

Strace多线程程序

在多线程程序上运行strace时,我得到如下结果:

[pid 14778] futex(0x7fd8082f266c, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7fd8082f2668, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1} <unfinished ...>
[pid 14780] <... futex resumed> )       = 0
Run Code Online (Sandbox Code Playgroud)

注意参数在一行上<unfinished...>,结果在另一行上<...resumed>.没有与其结果相关的参数会降低strace的效用.在跟踪多线程程序时,是否可以使strace在同一行上打印结果和参数?

linux strace

7
推荐指数
1
解决办法
5714
查看次数

使用strace修复挂起内存问题

我有一个在RHEL6.x(64位)上运行的多线程进程.

我发现当我尝试启动进程时,进程会挂起并且某些线程(同一进程)会崩溃.有些线程等待线程之间的共享内存被创建(我可以看到所有这些都没有被创建).

但是当我使用strace时,进程不会挂起并且它工作得很好(所有应该创建的内存都会被创建).即使在创建内存后中断strace,也可以保持进程正常运行.

我读过这个:

strace修复了挂起过程

这确实给了我一个想法.但我仍然不清楚这是因为他们使用的RHEL版本没有被提及.

另外,另一点是,将内核更改为fedora(兼容)内核不会产生问题.

所以,我想知道strace究竟是如何影响一个过程的?(或者只是如链接中指出的那样移回内核的堆栈)?

unix kernel process rhel strace

7
推荐指数
1
解决办法
345
查看次数

在strace中捕获vDSO

我在想,如果有一种方法来捕获(即观察)VDSO调用像gettimeofday在strace.

还有,有没有办法在不加载linux-vdso.so.1(标志或env变量)的情况下执行二进制文件?

最后,如果我编写一个程序linux-vdso.so.1从辅助向量中删除地址然后execve我的程序呢?有人试过吗?

system-calls linux-kernel strace vdso

7
推荐指数
1
解决办法
885
查看次数

使用(DR)STRACE比较Windows程序执行

我在github上针对node-serialport 直接提出了一个关于这个问题的问题.简而言之,过去在库的v4.x中工作正常的东西不再适用于库的v6.x. 我认为它必须与库如何打开COM端口(选项或其他东西)有关,我怀疑它在当前版本的库中人为地限制了通过USB提供的功率.

我编写了最简单的脚本,我可以使用以下方法重现问题(在问题中发布的脚本):

  • NodeJS和v4.x的库[作品]
  • 库的NodeJS和v6.x [失败]
  • Python和PySerial等价[作品]

根据存储库维护者的建议,我研究并发现了一个名为drstrace的Windows实用程序,它允许我捕获执行一段时间内执行的每个脚本的日志(这些日志作为附件发布在引用中问题).

现在我卡住了,因为我不知道如何制作drstrace日志的正面或反面,尽管我确信在比较三个文件时差异可能很明显.我只是不知道如何阅读drstrace日志和Windows驱动程序和系统调用来突破.

我意识到在这里发布这个问题是一种绝望的行为,但我认为它值得一试.希望很明显,我并不缺乏自己的努力,我现在只是在我的头上,并可以使用更多的帮助.任何指导将不胜感激.最令人敬畏的是那些精通这种诊断水平的人,让他们看一看并阅读茶叶.回馈这样一个重要的开源库会很棒.

2017年11月10日更新

我联系FTDI支持询问:

我在很多产品中使用FT231X.我需要一些帮助来理解Windows FTDI驱动程序如何管理电源.更重要的是,我希望你能帮我理解如何指导驱动程序允许USB允许的全部500mA电流通过Windows电脑传送到我的产品.

答复是:

只需使用我们的FT_Prog实用程序将最大VBUS电流设置为500 mA: 在此输入图像描述

FT231X枚举后,该驱动电流可用.

我还没有尝试过这个建议,但我想和读这篇文章的人分享.事实上,node-serialport 6.0.4行为与node-serialport 4.0.7行为和pyserial行为都不同.

serial-port pyserial strace node.js

7
推荐指数
1
解决办法
159
查看次数

如何在 mac 上调用 strace 的等效命令——最好是从 python 调用?

独立的可重现示例

\n

我需要通过 python 跟踪任何命令的输出。但我只需要将以下 amd linux 命令转换为 mac m1/arm 命令(因此 python 可能不相关):

\n
strace -e trace=execve -v -s 100000000 -xx -ttt -ff -o output.txt sh -c \'echo hi\'\n
Run Code Online (Sandbox Code Playgroud)\n

我怎么做?

\n

这对我来说失败了:

\n
 \xe2\x9d\xaf sudo dtruss -t execve -f sh -c \'echo hi\'\ndtrace: system integrity protection is on, some features will not be available\n\ndtrace: failed to execute sh: Operation not permitted\n
Run Code Online (Sandbox Code Playgroud)\n

笔记:

\n
    \n
  • 我可以完全控制输入,因此我可以在我的 mac 中执行 sudo 和相关命令(主要是为了调试我的代码,因此它可以在 pycharm 上运行)
  • \n
\n
\n

来自brew的strace失败

\n

我似乎无法从brew …

python macos strace systrace apple-m1

7
推荐指数
2
解决办法
7367
查看次数

“strace”修复挂起的进程

我有一个单线程 Unix 进程,它通过TCP与其他进程进行通信。

问题如下。当我启动该进程时,它会挂起(没有繁忙循环),直到我杀死它。

有趣的是,一旦我将strace附加到它,它就会继续以预期的行为运行,就好像根本没有任何问题一样(总是可重现)。

这种行为的原因可能是什么?strace对进程的状态有什么影响?


strace 改变行为的原因是,因为我们使用 openonload 有一个错误。一旦我们附加了 strace,堆栈就被移回内核,问题就消失了。

unix process rhel strace

6
推荐指数
1
解决办法
3409
查看次数

strace:&lt;未完成...&gt;和&lt;...已恢复&gt;的顺序

我正在编写一个脚本,用于分析以跟踪的文件访问strace。

跟踪中包含一些已被另一个进程中断的调用。strace使用<unfinished ...>和<... close resumed>(在close通话中断的情况下)标记向他们显示。

[pid 26817] 12:48:22.972737 close(449 <unfinished ...>
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 <... close resumed> ) = 0 
Run Code Online (Sandbox Code Playgroud)

该进程及其所有线程均已通过以下方式跟踪

strace -f -tt -p <pid>
Run Code Online (Sandbox Code Playgroud)

手册页不确定调用何时完成。

如果正在执行系统调用,同时正在从不同的线程/进程调用另一个系统调用,则strace将尝试保留这些事件的顺序,并将正在进行的调用标记为未完成。呼叫返回时,它将被标记为已恢复。

尽管我假设是这样,但resumed标记自然会指示该呼叫现在已经结束。我想问是否是这样。

可以将上述跟踪摘要重构为

一种

[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 close(449) = 0
Run Code Online (Sandbox Code Playgroud)

还是应该重建为

乙

[pid 26817] 12:48:22.972737 close(449) = 0 
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished …
Run Code Online (Sandbox Code Playgroud)

linux strace

6
推荐指数
1
解决办法
7375
查看次数

如何从strace输出中解码此信息

我写了一个小的go脚本并使用strace跟踪它,虽然这个脚本,我试图使用netlink协议从内核获取审计消息,就像auditd一样.

以下是我去的脚本输出 - http://paste.ubuntu.com/8272760/

我试图找到auditd提供给sendto函数的参数.当我在auditd上运行strace时,我得到以下输出

sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16
Run Code Online (Sandbox Code Playgroud)

当我扫描我的go文件时,我得到以下输出.我想解码这个陈述的第二个参数

sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17
Run Code Online (Sandbox Code Playgroud)

再具体一点

"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t" 
Run Code Online (Sandbox Code Playgroud)

现在我想将其转换为字符串或字节数组,有没有办法将其转换为字符串或字节数组?

在我的实际转码中,这个参数是一个字节数组.

https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58

c audit go strace netlink

6
推荐指数
3
解决办法
9680
查看次数

strace一个python函数

是否有可能为打开的文件划分python函数,并区分它们是否由python或子进程打开?

read_python, read_external = [], []

@strace_read(read_python, read_external)
function test():
    file = open("foo.txt", "r")
    subprocess.call(["cat", "bar.txt"])

for file in read_python:
    print("python:      ", file)
for file in read_external:
    print("external:    ", file)
Run Code Online (Sandbox Code Playgroud)

所以输出如下:

>>> python:      foo.txt
>>> external:    bar.txt
Run Code Online (Sandbox Code Playgroud)

我最感兴趣的是使用装饰器.区分不是优先事项.

从概念上讲,我最好的猜测是load_function(open)用包装器替换实例......实际上,我不知道,有太多的方法可以访问open.

python strace

6
推荐指数
1
解决办法
3936
查看次数

Gammu在strace下运行时有不同的行为

我正在尝试调试Gammu,一个"移动电话的库和命令行实用程序",当与调制解调器正常通信时"超时".

gammu identify - > No response in specified timeout. Probably phone not connected.

看着它产生额外的调试信息,出于某种原因,它不"承认"调制解调器响应IS给予(给予拨打AT命令通过手动串行终端时,它有正确的反应).

但是,我的问题主要是关于在strace下运行SAME PROGRAM,它没有问题,并且没有超时.

strace -e trace=open,close,read,write gammu identify - >(关于调制解调器的一大堆信息)

什么/将会做什么会导致这种行为上的差异?strace如何影响其子进程?

(在Ubuntu 18.04上运行,Gammu 1.39.0)

strace gammu

6
推荐指数
1
解决办法
65
查看次数