strace会阻止正确执行程序吗?

时间:2012-08-11 11:00:14

标签: c++ c strace futex

我想知道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是否是虚假的。如果没有,是否需要注意任何系统调用,因为它们可能不适用于strace,或者这种奇怪的行为是否涉及一组系统调用?有没有办法解决这个问题?

我正在使用debian-squeeze,如果这可能是相关的。

更新1

我完全忘了提到我正在运行多个线程(POSIX线程)和一些孩子。虽然pthread_cond_wait()不应该遇到任何种族,因为它绝对是pthread_mutex_lock()访问pthread_cond_tpthread_mutex_t之后的第一个调用,我将其解析为参数。但我不知道pthread_cond_wait()内是否有任何竞争条件。如果需要,我会提供程序代码。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

严肃地说,程序中的某些时间问题可能会在某些情况下发生吗?这些时序问题对于多线程尤其吝啬(例如,死锁仅在发布模式下发生)。