我想知道 strace 是否会导致它正在跟踪的程序出现异常。目前,我正在尝试跟踪一个随机分段错误错误(但当我使用 strace 时,程序似乎永远不会以这种方式崩溃),这是在我调用pthread_cond_wait()
.
当我直接运行我的程序时——它实际上是 c/c++ 的混合体,它有时会按预期工作,但如前所述,有时它会崩溃pthread_cond_wait()
(顺便说一句,如果有人想帮助我解决这个问题,请参阅此处,任何帮助将不胜感激)。
如果我直接运行我的程序并将 strace 附加到这样的进程:
strace -ttTD -o strace_today.txt -p PROCESS_ID
输出是单行的,它说它正在等待一个 futex(实际上像这样:)
futex(x,FUTEX_WAIT_PRIVATE,x)
如果我像这样从 strace 运行我的程序:
strace -ttTD -o strace_today.txt example_program
然后在我的文件输出的某个时刻,准确地说,当我调用 时pthread_cond_wait()
,它会不断发送类似这样的多行垃圾邮件(并且每次futex()
调用等待的值都比以前高,这里是 15)
12:46:15.636366 semop(11599962, {{0, -1, 0}}, 1) = 0 <0.000031>
12:46:15.636512 futex(0x8053838, FUTEX_WAKE_PRIVATE, 1) = 0 <0.000033>
12:46:15.636637 futex(0x8053864, FUTEX_WAIT_PRIVATE, 15, NULL) = ? ERESTARTSYS (To be restarted) <0.002034>
12:46:15.638832 futex(0x8053864, FUTEX_WAIT_PRIVATE, 15, NULL) = 0 <0.001449>
12:46:15.640436 clone(child_stack=0xb6cd0484, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb6cd0bd8, {entry_number:6, base_addr:0xb6cd0b70, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb6cd0bd8) = 25403 <0.000045>
12:46:15.640598 semop(11599962, {{0, -1, 0}}, 1) = 0 <0.000015>
我还尝试将 strace 作为一个孩子而不是该过程的父母来运行(希望它会有所作为)。即使我试图捕捉那个随机分段错误错误,它也从未出现/发生过。
现在我的问题是这是否常见和故意,或者我的 strace-call 是否是虚假的。如果没有,是否有任何系统调用我需要注意,因为它们可能不适用于 strace,或者这种奇怪的行为是否涉及一组系统调用?有没有办法解决?
我正在使用 debian-squeeze,如果这可能相关的话。
更新 1
我完全忘了提到我正在运行多个线程(POSIX 线程)和几个孩子。虽然不pthread_cond_wait()
应该遇到任何比赛,因为它绝对是 a 之后的第一个调用,pthread_mutex_lock()
它访问pthread_cond_t
和pthread_mutex_t
我正在解析为参数。但我不知道里面是否pthread_cond_wait()
可能有任何竞争条件。如有必要,我将提供程序代码。