【发布时间】:2019-01-14 20:20:32
【问题描述】:
我有一个场景,在基于 arm 的 yocto/poky linux 系统上,一个 c++ 应用程序的线程有时会冻结。它在 clock_nanosleep 系统调用中的某个地方停止。
我可以使用 gcore 生成核心文件并使用 gdb 附加,但它只显示调用堆栈的用户模式部分,该部分在软件中断处结束。
有没有办法从核心转储中找出线程在内核中的实际位置?
编辑:这是方法调用的代码。变量 t 在栈上。
do {
ret = clock_nanosleep(CLOCK_MONOTONIC, 0, &t, &t);
} while (ret == EINTR);
问候
【问题讨论】:
-
我是否正确理解您只有应用程序冻结?如果是这种情况,您可能可以使用
strace来查看系统调用是否返回,或者如果这还不够,请使用更强大的东西,例如 systemtap。 -
"它在 clock_nanosleep 系统调用中的某处停止。"我的意思是,这就是系统调用的重点
-
您可能遇到了死锁或竞争情况。你需要在睡觉前发布相关的线程代码。
-
为了澄清:它在clock_nanosleep中花费了整整一分钟。它不只是在我倾倒时偶然出现的。应用程序不会冻结,只有一两个线程会冻结,并且所有线程都在 clock_nanosleep 中。是的,我检查了输入时间很短(每个 5 毫秒)。
-
另一个黑暗中的猜测:你是初始化结构中的所有字段还是可能是某些使用未初始化的数据?否则我担心你将不得不进行内核调试,这是一个相当痛苦的过程。