2

スレッドを使用すると、テストアプリケーションが正しいダンプファイルを生成しないことがわかりました。クロスコンパイラーを使用して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の問題はありますか?

  • クロスコンパイルライブラリの問題はありますか?

  • カーネルは違いを生みますか?特定の機能を有効にする必要がありますか?

  • これをどのように機能させることができますか?つまり、ターゲットで実行されているマルチスレッドアプリは、正しいミニダンプファイルを生成します

4

1 に答える 1

1

Google ブレークパッドは、Pentium III x86 より前のプロセッサではミニダンプを作成できません。

Pentium III 以降には、ブレークパッドの sys_ptrace 呼び出しによって要求される 8 つの追加の浮動小数点レジスタが含まれています。

src/client/linux/minidump_writer/linux_ptrace_dumper.cc:
if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1)
    return false;

Pentium III より前のプロセッサでは、この呼び出しは失敗し、ミニダンプ全体が失敗します。

于 2012-09-12T12:42:34.990 に答える