我想知道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,如果这可能是相关的。
我完全忘了提到我正在运行多个线程(POSIX线程)和一些孩子。虽然pthread_cond_wait()
不应该遇到任何种族,因为它绝对是pthread_mutex_lock()
访问pthread_cond_t
和pthread_mutex_t
之后的第一个调用,我将其解析为参数。但我不知道pthread_cond_wait()
内是否有任何竞争条件。如果需要,我会提供程序代码。
答案 0 :(得分:3)
造成这类问题的最可能原因是strace会影响应用程序的时间,这可能会导致锁定错误。
答案 1 :(得分:2)
几乎所有C ++和C段错误都包含某些未定义的行为。因此,编译器可以自由地实现在运行strace时不会触发的崩溃系统。
严肃地说,程序中的某些时间问题可能会在某些情况下发生吗?这些时序问题对于多线程尤其吝啬(例如,死锁仅在发布模式下发生)。