在多线程程序上运行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在同一行上打印结果和参数?
我有一个在RHEL6.x(64位)上运行的多线程进程.
我发现当我尝试启动进程时,进程会挂起并且某些线程(同一进程)会崩溃.有些线程等待线程之间的共享内存被创建(我可以看到所有这些都没有被创建).
但是当我使用strace时,进程不会挂起并且它工作得很好(所有应该创建的内存都会被创建).即使在创建内存后中断strace,也可以保持进程正常运行.
我读过这个:
这确实给了我一个想法.但我仍然不清楚这是因为他们使用的RHEL版本没有被提及.
另外,另一点是,将内核更改为fedora(兼容)内核不会产生问题.
所以,我想知道strace究竟是如何影响一个过程的?(或者只是如链接中指出的那样移回内核的堆栈)?
我在想,如果有一种方法来捕获(即观察)VDSO调用像gettimeofday在strace.
还有,有没有办法在不加载linux-vdso.so.1(标志或env变量)的情况下执行二进制文件?
最后,如果我编写一个程序linux-vdso.so.1从辅助向量中删除地址然后execve我的程序呢?有人试过吗?
我在github上针对node-serialport 直接提出了一个关于这个问题的问题.简而言之,过去在库的v4.x中工作正常的东西不再适用于库的v6.x. 我认为它必须与库如何打开COM端口(选项或其他东西)有关,我怀疑它在当前版本的库中人为地限制了通过USB提供的功率.
我编写了最简单的脚本,我可以使用以下方法重现问题(在问题中发布的脚本):
根据存储库维护者的建议,我研究并发现了一个名为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行为都不同.
我需要通过 python 跟踪任何命令的输出。但我只需要将以下 amd linux 命令转换为 mac m1/arm 命令(因此 python 可能不相关):
\nstrace -e trace=execve -v -s 100000000 -xx -ttt -ff -o output.txt sh -c \'echo hi\'\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n笔记:
\n我似乎无法从brew …
我正在编写一个脚本,用于分析以跟踪的文件访问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) 我写了一个小的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
是否有可能为打开的文件划分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.
我正在尝试调试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)