2

私は立ち往生しており、新鮮な目を使用できます。

CodeSourcery ツール チェーンを使用して Variscite OMAP4 開発ボード用にクロス コンパイルした比較的単純な Linux プログラムがあります。プログラムは単にスレッドを作成し、スレッドが終了するのを待って存在します。スレッドは、スリープを挟んでいくつかの文字列を出力するだけです。

私の問題は、スレッドが作成された直後にスレッドでプログラムのセグメンテーション違反が発生することです。バックトレースは、そのクラッシュが標準の共有ライブラリで発生したことを示唆しています。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;
}

MyThread.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
4

1 に答える 1

0

さらに調査と実験を行った結果、使用しているVarisciteボードのstdc++ライブラリの欠陥が原因でクラッシュが発生したと判断しました。スレッドクラスを使用できるように、コードで2011C++標準拡張を有効にしました。スレッドコンストラクターが呼び出されると、pthreadライブラリのstart_thread関数がstdc ++ライブラリ内の不明な関数を呼び出し、クラッシュが発生します。2011 C ++拡張機能を使用せず、代わりにpthread呼び出しを使用するようにコードを変更したところ、単純なコードが機能しました。私はこの欠陥をバリサイトに知らせました。

于 2012-12-06T14:23:08.583 に答える