【问题标题】:Generating callstack from inside system call从内部系统调用生成调用堆栈
【发布时间】: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 毫秒)。
  • 另一个黑暗中的猜测:你是初始化结构中的所有字段还是可能是某些使用未初始化的数据?否则我担心你将不得不进行内核调试,这是一个相当痛苦的过程。

标签: c++ linux yocto


【解决方案1】:

无法从用户空间获取内核调用堆栈。即使有可能,它也几乎无法帮助您调试问题。

确保您不小心在线程之间共享传递给 clock_nanosleep() 的结构,确保函数返回的所有错误都得到处理和报告,您使用的是正确的时钟源(可能是 CLOCK_MONOTONIC)并且您正在使用manual中所述的clock_nanosleep()

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2021-03-20
    • 2021-04-28
    • 2022-01-16
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多