linux 在pthread中调用函数时收到Signal 11,但在main()中调用时没有问题

9vw9lbht  于 2023-06-21  发布在  Linux
关注(0)|答案(1)|浏览(150)

环境:STM32设备上的Linux-4.19。

3个src文件

main()第一个文件中。

thread_client_r()是pthread-start_routine-function,在第二个文件中定义。
device_getData()是要调用的目标函数,在3rd文件中定义。

int main() {
    // Some initialization ...
    
    pthread_t tid_client_read;

    pthread_create(&tid_client_read, NULL, &thread_client_r, NULL); 
    pthread_join(tid_client_read, NULL);

    return 0;
}
void* thread_client_r(void *arg)
{
    while(1)
    {
        sleep(1);
        printf(" thread_client_r \n"); // this can be printed
        device_getData();
    }
}
int device_getData()
{
    printf(" device_getData\n"); // this can't be printed while called in subthread.

    // Do something (call ModbusTcp read API in .so library)
}

1.在main()中调用pthread_create & pthread_join,然后在subthreadthread_client_r()中调用device_getData(),接收信号11;
2.直接在main()中调用device_getData()没有问题

有任何解决问题的想法PLZ?

1l5u6lss

1l5u6lss1#

所以我看了一下你面临的这个问题。
从***thread_client_r()***函数调用***device_getData()***函数似乎会导致分段错误(信号11)。当直接从main()函数调用***device_getData()***时,不会发生此行为。
我会尝试:

检查空指针:确保**device_getData()函数中使用的所有指针都已正确初始化,且不为NULL。当通过NULL指针访问内存时,经常会出现分段错误。
验证线程安全:确保device_getData()函数是线程安全的。如果它不是为多个线程并发使用而设计的,则可能需要同步机制(如锁或信号量)来防止竞争条件。
**检查堆栈大小:检查线程的默认堆栈大小是否足够执行
device_getData()***函数。如果函数需要较大的堆栈,则可能需要在创建线程之前使用
pthread_attr_setstacksize()***增加堆栈大小。
开启调试:使用调试符号编译代码并启用核心转储。这将允许您获得有关崩溃的更多信息。当发生分段错误时,使用调试器(如
gdb
)检查核心转储,以确定崩溃的确切位置。
**查看外部库:如果*device_getData()**函数依赖于外部库(例如提到的ModbusTcp读取API),请确保您使用的库版本正确,并且与您的STM32设备兼容。
**检查编译器和编译器标志:检查编译器及其用于构建代码的标志。确保指定了正确的体系结构、优化选项和必要的库。
内存损坏:代码中的其他地方可能会出现内存损坏,从而在从单独的线程调用
device_getData()***函数时会受到影响。检查代码中是否存在任何潜在的与内存相关的问题,如缓冲区溢出、无效内存访问或未初始化的变量。

我希望在这之后你能缩小问题的范围。

相关问题