微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Raspberry PI4 分段错误

如何解决Raspberry PI4 分段错误

我有一个简短的程序,它在运行几次后导致 RPi4 出现分段错误(例如:循环 10 次)。 我正在使用 Raspbian GNU/Linux 10 (buster) 和认的 gcc 编译器 (sudo apt install build-essential)

gcc --version
gcc (Raspbian 8.3.0-6+rpi1) 8.3.0

你认为这是 gcc 编译器的问题吗?也许我缺少 RPi4 的一些特殊设置。 我正在使用它来构建:

gcc threads.c -o threads -l pthread

有时(并非总是)输出是这样的:

...
in thread_dummy,loop: 003
Segmentation fault

代码在这里

#include <stdio.h>  /* for puts() */
#include <unistd.h> /* for sleep() */
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <pthread.h>

#define PTR_SIZE (0xFFFFFF)
#define PTR_CNT (10)

void* thread_dummy(void* param)
{
    void* ptr = malloc(PTR_SIZE);

    //fprintf(stderr,"thread num: %03i,stack: %08X,heap: %08X - %08X\n",(int)param,(unsigned int)&param,(unsigned int)ptr,(unsigned int)((unsigned char*)ptr + PTR_SIZE));
    fprintf(stderr,"in thread_dummy,loop: %03i\n",(int)param);

    sleep(1);

    free(ptr);

    pthread_detach(pthread_self());
    return NULL;
}

int main(void)
{
    void* ptrs[PTR_CNT];
    pthread_t threads[PTR_CNT];
    for(int i=0; i<PTR_CNT; ++i)
    {
        ptrs[i] = malloc(PTR_SIZE);
        //fprintf(stderr,"main   num: %03i,i,(unsigned int)&ptrs,(unsigned int)ptrs[i],(unsigned int)((unsigned char*)ptrs[i] + PTR_SIZE));
        fprintf(stderr,"in main,i);
    }

    fprintf(stderr,"-----------------------------------------------------------\n");

    for(int i=0; i<PTR_CNT; ++i)
        pthread_create(&threads[i],thread_dummy,(void*)i);

    for(int i=0; i<PTR_CNT; ++i)
        pthread_join(threads[i],NULL);

    for(int i=0; i<PTR_CNT; ++i)
        free(ptrs[i]);

    return EXIT_SUCCESS;
}

更新: 我也用新的gcc测试了它,但问题仍然存在...

gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/arm-linux-gnueabihf/11.1.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../configure --enable-languages=c,c++,fortran --with-cpu=cortex-a72 --with-fpu=neon-fp-armv8 --with-float=hard --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (GCC)

解决方法

pthread_create 类似于 malloc,而 pthread_detach or pthread_join 类似于 free。你基本上是在做类似“双重释放”的事情——你分离一个线程并同时加入它。分离或加入线程。

您可以从 pthread_join 中删除 main。但是你应该在逻辑上从线程内部删除 pthread_detach(...),这实际上是无用的,因为无论如何线程都会立即终止。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。