我想知道strace是否会导致它正在跟踪的程序出现异常。目前,我正在尝试跟踪一个随机的分段错误(但当我使用strace时,程序似乎永远不会以这种方式崩溃),这是由我调用pthread_cond_wait()的一行引起的。
当我直接运行我的程序时-它实际上是c/c++的混合,它有时会像它应该的那样工作,但正如前面提到的,有时它在pthread_cond_wait()上崩溃(顺便说一句,如果有人想要帮助我解决这个问题,see here,任何帮助都会非常感谢)。
如果我直接运行我的程序并将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是假的。如果没有,有没有我需要注意的syscall,因为它们可能不能与strace一起工作,或者这种奇怪的行为与一组syscall有关吗?有什么办法可以解决这个问题吗?
我正在使用debian-squeeze,如果这可能是相关的话。
更新1
我完全忘记提到我正在运行多个线程(POSIX线程)和几个孩子。虽然pthread_cond_wait()应该不会遇到任何竞争,因为它绝对是pthread_mutex_lock()之后的第一个调用,它访问我解析为参数的pthread_cond_t和pthread_mutex_t。但我不知道pthread_cond_wait()内部是否存在任何竞争条件。我会提供程序代码,如果有必要。
发布于 2012-08-11 19:10:45
这类问题最有可能的原因是strace可能会影响应用程序的时间,这可能会暴露出锁定错误。
发布于 2012-08-11 19:11:51
几乎所有的C++和C段故障在某些时候都包含未定义的行为。因此,编译器可以自由地实现一个在strace运行时不会触发的崩溃系统。
更严重的是,程序中有没有在strace下不会发生的定时问题呢?这些计时问题在多线程中尤其小气(例如,只有在发布模式下才会发生死锁)。
https://stackoverflow.com/questions/11914097
复制相似问题