スレッドを使用すると、テストアプリケーションが正しいダンプファイルを生成しないことがわかりました。クロスコンパイラーを使用してBreadpadライブラリーを構築し、それをクロスコンパイラーとリンクしてターゲット上で実行しています。
まず、セットアップについて説明します。
構築:Ubuntu 12.04、i686
ホスト/ターゲット:i586 CPU、完全カスタムLinuxシステムであるVortex86DX
ビルドツール:Buildroot、crosstool-ng、gcc 4.4.6、glibc 2.9
Breakpadを構築するには、次のようにします。
$ ./configure CC=/opt/br/output/host/usr/bin/i486-unknown-linux-gnu-gcc CXX=/opt/br/output/host/usr/bin/i486-unknown-linux-gnu-g++ --host=i486-unknown-linux-gnu
$ make
私のクロスコンパイラはBuildrootに統合されており、で実行されるバイナリを構築したい--host=i486-unknown-linux-gnu
私は次のようにテストアプリをクロスコンパイルします。
$ /opt/br/output/host/usr/bin/i486-unknown-linux-gnu-g++ -g mytest.cpp client/linux/libbreakpad_client.a -I. -lrt -lpthread -lboost_thread -o mytest
テストアプリは次のとおりです。
#include <boost/thread/thread.hpp>
#include "./client/linux/handler/exception_handler.h"
#include <unistd.h>
static bool dumpCallback( const google_breakpad::MinidumpDescriptor &md,
void *context, bool succeeded)
{
printf( "dump path: %s\n", md.path());
return succeeded;
}
void crash1()
{
volatile int* a = (int*)(NULL);
*a = 1;
}
void crash2()
{
volatile int x, y;
y = 0;
x/=y;
}
void t1()
{
sleep(1);
crash1();
}
void t2()
{
while(1) sleep(10);
}
int main()
{
google_breakpad::MinidumpDescriptor md("/tmp");
google_breakpad::ExceptionHandler eh(md, NULL, dumpCallback, NULL, true, -1);
// comment out to select between thread crash, main crash, main crash with non-crashing thread
boost::thread thread1(t2);
sleep(1);
crash1();
sleep(3);
return 0;
}
main()からのクラッシュとスレッドからのクラッシュのバリエーションを作成するだけです。
ターゲット上でアプリをクロスコンパイルして実行したときの観察:
(1)スレッドのないテストアプリは、ターゲット上に正しいダンプファイルを作成します。パス
(2)スレッドがクラッシュするテストアプリは、ターゲット上に非常に小さくて正しくないダンプファイル(ほとんどがゼロ)を作成します。不合格
(3)スレッドがクラッシュせず、メインがクラッシュするテストアプリは、ターゲット上に中サイズの不正なダンプファイルを作成します。不合格
編集:(1)の場合、コールバックはsuccessed=trueを返します。(2)と(3)の場合、succeeded=falseです。したがって、ライブラリはそれが成功しなかったことを知っています。なぜそれが私の目標に失敗するのかを見つけるのが私の仕事だと思います。
同じテストアプリをコンパイルしてビルドコンピューターで実行すると、すべての状況で実行され、正しいダンプファイルが作成されます。つまり、ビルドコンピューターでクロスコンパイルされたCrashpadライブラリを正常に実行し、正常に動作します。ビルドとホストの両方がx86であるため、これが可能です。
たとえば、非クロスコンパイルg++を使用してビルドします
g++ -g mytest.cpp client/linux/libbreakpad_client.a -I. -lrt -lpthread -lboost_thread -o mytest
私の質問は次のとおりです。
Breakpadの問題はありますか?
クロスコンパイルライブラリの問題はありますか?
カーネルは違いを生みますか?特定の機能を有効にする必要がありますか?
これをどのように機能させることができますか?つまり、ターゲットで実行されているマルチスレッドアプリは、正しいミニダンプファイルを生成します