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

问题描述

| 我正在使用的软件遇到异常行为。它是一个用C ++编写的实时机器控制器,在Linux上运行,并且正在广泛使用多线程。 当我在不要求实时性的情况下运行该程序时,一切都会按照我的预期进行。但是,当我要求它切换到实时模式时,有一个明显可复制的错误使应用程序崩溃。我猜这一定是一些僵局,因为它是一个互斥体,会超时并最终触发断言。 我的问题是,如何追捕这个。从产生的核心查看回溯并不十分有用,因为问题的原因可能是过去的某个原因。 以下代码在“正常”和“实时”行为之间进行切换: 在main.cpp中(简化后,通过断言检查返回码):
if(startAsRealtime){
struct sched_param sp;
memset(&sp,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);}
提前致谢     

解决方法

如果将ѭ2用作C库,则可以使用以下问题的答案:是否可以列出线程持有的互斥锁,以找出持有超时的互斥锁的线程。那应该开始缩小范围-然后您可以检查该线程并找出为什么它没有放弃互斥体。     ,您的实时线程之一可能正在循环中旋转(不让步),从而使其他线程饿死并导致互斥锁超时。 也可能存在竞争条件,该条件仅在您切换到“实时模式”时才会显示出来。实时模式下的事件计时恰巧会触发某种死锁。 如果您拥有可以获取多个级别的锁或递归锁的位置,则这些位置应该是您怀疑的第一个位置。 如果您真的不知道问题出在哪里,请尝试使用二进制搜索方法来解决问题。递归地切除一半的功能,直到将其范围缩小到实际问题为止。您可能必须模拟一些临时切断的子系统。 您可以将这种二进制搜索技术应用于互斥锁获取超时,以找出罪魁祸首。