多线程程序中的分段故障和gdb回溯上的不完整信息
Segmentation Fault in Multithreaded program and incomplete information on gdb backtrace
我正在编写一个同时使用操作系统线程和用户线程的程序(光纤,我编写了这个用户线程程序,通过汇编语言切换上下文(。问题是,程序有时会以分段错误结束,但有时不会。
问题是由于调用了一个函数,该函数具有无效的参数,不应该调用这些参数。我认为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 ?? ()
结论:
- GDB为您提供正确的崩溃堆栈跟踪
- 实际上,您确实使用
fn==0
调用thread_entry
,这当然会立即崩溃 - 有一些有趣的事情正在发生,因为这不是每次都会发生的
即使调用了它,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
的心理模型是错误的。
这对我来说有点太多了。如果你想要更多的帮助,请将测试用例减少到最低限度。
- 当回溯以零开始时,如何调试崩溃
- 正在查找文档以获得PS4平台的C++中的设备信息
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 回溯C++不打印函数,因此文件
- 如何设置一个范围来提取我想要获得的信息
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 为什么 gcovr 会生成空覆盖率统计信息?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何解释GDB中回溯的模板函数签名?
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 在远程嵌入式设备上使用核心文件的 GDB - 如何获取有关回溯的更多信息?
- GDB 回溯跟踪未显示正确的信息
- 如何从谷歌测试中的异常中获取回溯信息