代码之家  ›  专栏  ›  技术社区  ›  Abhishek Sagar

pthread_mutex_lock()处的segfult

  •  0
  • Abhishek Sagar  · 技术社区  · 5 年前

    我有一个打印数据结构的代码。

    void
    print_wheel_timer(wheel_timer_t *wt){
    
     <code to print data structure>
    }
    
    Then i sandwiched the code in-between lock and unlock mutex calls. 
    
    void
    print_wheel_timer(wheel_timer_t *wt){
    pthread_mutex_lock(&wt->global_lock);
    <code to print data structure>
    pthread_mutex_unlock(&wt->global_lock);
    }
    

    现在,它是赛格法特。 我已经禁用了代码中的所有线程,现在程序是单线程的,仍然是segfault。 我正在使用gcc,ubuntu 19.04。

    gdb展会 pthread_mutex_lock() 调用正在破坏数据结构!!真奇怪! 我将监视点放在由任意值写入的地址上,它显示对 pthread_mutex_lock() 正在修改它。当我移除这些锁定/解锁呼叫时,没有看到segfault。

    (gdb) watch *(glthread_t *)&(wt->slotlist[1].slots.right)
    Hardware watchpoint 2: *(glthread_t *)&(wt->slotlist[1].slots.right)
    (gdb) c
    Continuing.
    Printing Wheel Timer DS
    
    Thread 1 "test.exe" hit Hardware watchpoint 2: *(glthread_t *)&(wt->slotlist[1].slots.right)
    
    Old value = {left = 0x0, right = 0x0}
    New value = {left = 0x1, right = 0x0}     <<< corruption !!
    0x00007ffff7fa3934 in __GI___pthread_mutex_lock (mutex=0x5555555771d8)
    at ../nptl/pthread_mutex_lock.c:80
    80      ../nptl/pthread_mutex_lock.c: No such file or directory.
    (gdb) bt
    #0  0x00007ffff7fa3934 in __GI___pthread_mutex_lock (mutex=0x5555555771d8)
    at ../nptl/pthread_mutex_lock.c:80
    #1  0x000055555555f3a2 in print_wheel_timer (wt=0x555555577180)
    at WheelTimer/WheelTimer.c:276
    
    Code :
    ========
    void
    print_wheel_timer(wheel_timer_t *wt){
    
    int i = 0, j = 0;
    glthread_t *curr;
    glthread_t *slot_list_head = NULL;
    wheel_timer_elem_t *wt_elem = NULL;
    
    printf("Printing Wheel Timer DS\n");
    pthread_mutex_lock(&wt->global_lock);
    printf("wt->current_clock_tic  = %d\n", wt->current_clock_tic);
    printf("wt->clock_tic_interval = %d\n", wt->clock_tic_interval);
    printf("wt->wheel_size         = %d\n", wt->wheel_size);
    printf("wt->current_cycle_no   = %d\n", wt->current_cycle_no);
    printf("wt->wheel_thread       = %p\n", &wt->wheel_thread);
    printf("WT uptime              = %s\n", hrs_min_sec_format(WT_UPTIME(wt)));
    printf("wt->no_of_wt_elem      = %u\n", wt->no_of_wt_elem);
    printf("printing slots : \n");
    
    for(; i < wt->wheel_size; i++){
        slot_list_head = WT_SLOTLIST_HEAD(wt, i);
        ITERATE_GLTHREAD_BEGIN(slot_list_head, curr){           << segfaulting here for i = 1
            wt_elem = glthread_to_wt_elem(curr);
    

    如果某个神圣的灵魂想在他的机器上试试。 请在这里下载代码: https://github.com/sachinites/tcpip_stack

    After downloading :
    switch to branch "Hellos"
    git checkout Hellos
    Compile :
    make all
    run
    ./test.exe
    to reproduce , run the cmd : 
    debug show node H1 timer 
    

    现在它的核心功能是: print_wheel_timer() 实施于 轮定时器/轮定时器.c

    0 回复  |  直到 5 年前
        1
  •  1
  •   Abhishek Sagar    5 年前

    问题在于我的数据结构,其中零长度数组是C结构中的非最后一个成员,在读/写到这些数组时会损坏内存。可伸缩数组应该是结构的最后一个成员。

    typedef struct _wheel_timer_t {
        int current_clock_tic;
        int clock_tic_interval;
        int wheel_size;
        int current_cycle_no;
        pthread_t wheel_thread;
        slotlist_t slotlist[0];            << problem, make it last member
        slotlist_t reschd_list;
        unsigned int no_of_wt_elem;
        pthread_mutex_t global_lock;
    } wheel_timer_t;
    
        2
  •  0
  •   R.. GitHub STOP HELPING ICE    5 年前

    几乎可以肯定你的 wheel_timer_t 结构有一个 global_lock 类型成员 pthread_mutex_t * 而不是 pthread_mutex_t ,这意味着您传递了一个错误类型的指针,该指针只指向8字节的存储空间(假设是64位实现) pthread_mutex_lock . 如果使用编译器警告,则会检测到此问题; pthread_mutex_t ** 无法隐式转换为 pthread_mutex_t线程互斥* 编译器应该对此发出诊断。

    注意,这可能意味着您有其他重要的错误,并且您的互斥锁没有正确初始化。