2

我想知道 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_tpthread_mutex_t我正在解析为参数。但我不知道里面是否pthread_cond_wait()可能有任何竞争条件。如有必要,我将提供程序代码。

4

2 回答 2

3

导致此类问题的最可能原因是 strace 会影响应用程序的时间,这可能会暴露锁定错误。

于 2012-08-11T11:10:44.597 回答
2

几乎所有 C++ 和 C 段错误在某些时候都包含未定义的行为。因此,编译器可以自由地实现一个在运行 strace 时不会触发的崩溃系统。

严肃地说,程序中的某个地方是否存在时序问题而不会在 strace 下发生?这些时间问题对于多线程来说尤其小气(例如,死锁仅在释放模式下发生)。

于 2012-08-11T11:11:50.883 回答