多线程程序中的分段故障和gdb回溯上的不完整信息

Segmentation Fault in Multithreaded program and incomplete information on gdb backtrace

本文关键字:回溯 信息 程序 分段 故障 多线程 gdb      更新时间:2023-10-16

我正在编写一个同时使用操作系统线程和用户线程的程序(光纤,我编写了这个用户线程程序,通过汇编语言切换上下文(。问题是,程序有时会以分段错误结束,但有时不会。

问题是由于调用了一个函数,该函数具有无效的参数,不应该调用这些参数。我认为gdb回溯没有提供正确的信息这是我的gdb程序的输出

#0  0x0000000000000000 in ?? ()
#1  0x0000555555555613 in thread_entry (fn=0x0, arg=0x0) at userThread2.cpp:243
#2  0x000055555555c791 in start_thread () at contextSwitch2.s:57
#3  0x0000000000000000 in ?? ()

fn是我想作为用户线程运行的函数,arg是传递给该函数的参数。在我的用户线程库代码中,我有一个函数Spawn,它将两个参数(fn和arg(和指向堆栈上start_thread的指针推送,因此调用了start_thread-一个汇编函数,它调用c++函数thread_entry来调用带有参数arg的函数fn。

我不希望在出现错误时调用start_thread或thread_entry,所以我不确定如何调用start_tthread。即使调用了它,Spawn((也应该调用start_thread,因为它是唯一调用start_tthread的函数。但是在gdb回溯中没有显示Spawn。

一些在线帖子提到了堆栈损坏或类似错误结果的可能性,并规定使用"记录btrace pt"。我花了相当长的时间在kernel/gdb中设置intel-btrace-pt支持,但我无法设置它,所以我不会走这条路。

以下是我的代码链接和编译说明:https://github.com/smartWaqar/userThreading

我在thread_entry上设置了一个断点,并观察到:

...
[Thread 0x7ffff7477700 (LWP 203995) exited]
parentId: 1 
OST 1 Hello A0 on CPU 2 
current_thread_num 0 next_thread_num 1
After Thread Exit 
After changeOSThread
OST 1 Hello C1 on CPU 2 ---------------
Before changeOSThread
**************** In changeOSThread **************
current_thread_num 1 next_thread_num 2
Thread 3 "a.out" hit Breakpoint 1, thread_entry (fn=0x0, arg=0x0) at userThread2.cpp:243
243     fn(arg) ;
(gdb) bt 
#0  thread_entry (fn=0x0, arg=0x0) at userThread2.cpp:243
#1  0x000055555555c181 in start_thread () at context.s:57
#2  0x0000000000000000 in ?? ()

结论:

  1. GDB为您提供正确的崩溃堆栈跟踪
  2. 实际上,您确实使用fn==0调用thread_entry,这当然会立即崩溃
  3. 有一些有趣的事情正在发生,因为这不是每次都会发生的

即使调用了它,Spawn((也应该调用start_thread,因为它是唯一调用start_tthread 的函数

我观察到以下对strart_thread的"调用":

Thread 2 "a.out" hit Breakpoint 1, start_thread () at context.s:53
53    push    %rbp
(gdb) bt 
#0  start_thread () at context.s:53
#1  0x0000555555555e4f in changeOSThread (parentId=<error reading variable>) at t.cc:196
#2  0x0000000000000000 in ?? ()

所以我认为你关于谁叫start_thread的心理模型是错误的。

这对我来说有点太多了。如果你想要更多的帮助,请将测试用例减少到最低限度。