linux - 调用线程构造函数时出现段错误

标签 linux multithreading segmentation-fault

我被困住了,可以使用一双新的眼睛。

我有一个相对简单的 Linux 程序,我使用 CodeSourcery 工具链为 Variscite OMAP4 开发板交叉编译了该程序。该程序只是创建一个线程,等待线程完成,然后存在。该线程仅输出一些字符串,中间有休眠。

我的问题是在创建线程后线程中的程序段错误。回溯表明该崩溃发生在标准共享库中。 GDB 可以告诉我加载的库不是加载的 .so 文件的地址,所以我不知道哪个库崩溃了,也不知道库中的偏移量。

代码、构建输出、程序输出和 GDB 输出如下。

有人知道要检查哪些事情以帮助找到根本原因吗?

MyMain.cpp

#include <thread>
#include <iostream>
using namespace std;

void MyThreadStart ();

int main ()
{
  cout << "main started." << endl;
  std::thread t2 (&MyThreadStart);
  cout << "thread CTOR invokved." << endl;
  t2.join();
  cout << "thread join completed." << endl;
  return 0;
}

我的线程.cpp

#include <iostream>
using namespace std;
#ifdef __cplusplus
extern "C" {
#include <unistd.h>
}
#endif

void MyThreadStart ()
{
  cout << "thread started." << endl;
  int loops = 3;
  while (loops--)
  {
    cout << "thread going to sleep." << endl;
    sleep (2);
    cout << "thread woke up." << endl;
    sleep (1);
  }
}

制作输出

16:51:39 **** Build of configuration Debug for project SegFaultTest ****
make all
Building file: ../MyMain.cpp
Invoking: ARM Sourcery Linux GCC C++ Compiler
arm-none-eabi-g++ -nostdinc -nostdinc++ -I/opt/arm/arm-none-linux-gnueabi/libc/usr/include -I/opt/arm/lib/gcc/arm-none-linux-gnueabi/4.7.2/include -I/opt/arm/arm-none-linux-gnueabi/include/c++/4.7.2 -I/opt/arm/arm-none-linux-gnueabi/include/c++/4.7.2/arm-none-linux-gnueabi -O0 -Wall -Wa,-adhlns="MyMain.o.lst" -fno-exceptions -fno-rtti -c -fmessage-length=0 -std=c++11  -mno-thumb-interwork -MMD -MP -MF"MyMain.d" -MT"MyMain.d" -mcpu=arm7 -g3 -gdwarf-2 -o "MyMain.o" "../MyMain.cpp"
Finished building: ../MyMain.cpp

Building file: ../MyThread.cpp
Invoking: ARM Sourcery Linux GCC C++ Compiler
arm-none-eabi-g++ -nostdinc -nostdinc++ -I/opt/arm/arm-none-linux-gnueabi/libc/usr/include -I/opt/arm/lib/gcc/arm-none-linux-gnueabi/4.7.2/include -I/opt/arm/arm-none-linux-gnueabi/include/c++/4.7.2 -I/opt/arm/arm-none-linux-gnueabi/include/c++/4.7.2/arm-none-linux-gnueabi -O0 -Wall -Wa,-adhlns="MyThread.o.lst" -fno-exceptions -fno-rtti -c -fmessage-length=0 -std=c++11  -mno-thumb-interwork -MMD -MP -MF"MyThread.d" -MT"MyThread.d" -mcpu=arm7 -g3 -gdwarf-2 -o "MyThread.o" "../MyThread.cpp"
Finished building: ../MyThread.cpp

Building target: SegFaultTest.elf
Invoking: ARM Sourcery Linux GCC C++ Linker
arm-none-eabi-g++ -Wl,-Map,SegFaultTest.map -mcpu=arm7 -g3 -gdwarf-2 -o "SegFaultTest.elf"  ./MyMain.o ./MyThread.o   -lpthread

Finished building target: SegFaultTest.elf

程序输出

$ ./SegFaultTest.elf
main started.
thread CTOR invokved.
Segmentation fault (core dumped)

GDB 输出

info shared
From        To          Syms Read   Shared Object Library
                        No          /lib/arm-linux-gnueabihf/libpthread.so.0
                        No          /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
                        No          /lib/arm-linux-gnueabihf/libm.so.6
                        No          /lib/arm-linux-gnueabihf/libgcc_s.so.1
                        No          /lib/arm-linux-gnueabihf/libc.so.6
                        No          /lib/ld-linux.so.3
bt
#0  0xb6f5e3d0 in ?? ()
#1  0xb6fb8ed2 in ?? ()
Backtrace stopped: frame did not save the PC

最佳答案

经过更多的调查和实验,我确定崩溃是由于我正在使用的 Variscite 板的 stdc++ 库中的缺陷引起的。我在我的代码中启用了 2011 C++ 标准扩展,因此我可以使用线程类。当调用线程构造函数时,pthread 库的 start_thread 函数调用了 stdc++ 库中的某个未知函数并发生崩溃。我将我的代码更改为不使用 2011 C++ 扩展,而是使用 pthread 调用,然后我的简单代码就可以工作了。我已将此缺陷告知 Variscite。

关于linux - 调用线程构造函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13654631/

相关文章:

linux - 仅当输入大于屏幕大小时,如何减少分页?

linux - Linux 上文件夹中的文件所有者列表

linux - 过滤命令输出并将其保存在 Json 格式列表中的 Shell 脚本

multithreading - slice 的并行性

java - 在事件调度线程中显示 JWindow

c - 段错误 11 和在 c 中创建/打印字符串数组时出现问题

c - 桶排序 - 段错误

c - numactl --physcpubind

c# - 使链表线程安全

c++ - 通过 Openmp 任务访问实例变量(隐式 firstprivate)时出现段错误