gpt4 book ai didi

c++ - 调试取决于所选调度程序的奇怪错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:07 25 4
gpt4 key购买 nike

我正在使用的软件出现奇怪的行为。它是一个实时机器 Controller ,用 C++ 编写,在 Linux 上运行,并且广泛使用多线程。

当我运行程序而不要求它是实时的时,一切都按我预期的那样工作。但是当我要求它切换到实时模式时,有一个明显可重现的错误让应用程序崩溃。我猜这一定是某种死锁,因为它是一个遇到超时并最终触发断言的互斥体。

我的问题是,如何追捕这个。从生成的核心查看回溯并不是很有帮助,因为问题的原因在于过去的某个地方。

以下代码在“正常”和“实时”行为之间进行切换:

在 main.cpp 中(经过简化,通过断言检查返回码):

if(startAsRealtime){
struct sched_param sp;
memset(&sp, 0, sizeof(sched_param));
sp.sched_priority = 99;
sched_setscheduler(getpid(), SCHED_RR, &sp);}

在每个线程中(简化后,通过断言检查返回码):

if(startAsRealtime){
sched_param param;
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_getschedparam(&attr, &param);
param.sched_priority = priority;
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_setschedparam(&attr, &param);}

提前致谢

最佳答案

如果您使用glibc 作为您的C 库,您可以使用问题Is it possible to list mutexs which a thread holds 的答案。找出持有超时互斥锁的线程。这应该开始缩小范围 - 然后您可以检查该线程并找出它不放弃互斥锁的原因。

关于c++ - 调试取决于所选调度程序的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6099178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com