Breakpad未能在目标创建转储,当我使用线程(Breakpad fails to create

2019-09-22 04:17发布

我发现,当我用我的线程测试应用程序不会产生一个正确的转储文件。 我使用的是交叉编译器来构建Breadpad库,然后用我的交叉编译器对目标运行的链接。

我将解释我的设置开始:

建立在:Ubuntu的12.04,为i686

主机/目标:Vortex86DX这是i586的CPU,完全定制的Linux系统

构建工具: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;
}

我简单地从主崩溃(),并从一个线程崩溃之间产生变化。

观测时,我交叉编译和运行我的目标应用:

(1)测试程序,没有线程,将创建目标正确的转储文件。 通过

(2)测试程序,与崩溃线程,将创建目标一个非常小的和不正确的转储文件(主要是零)。 失败

(3)测试程序,用一个线程,不会崩溃,以及主要是崩溃,将创建目标一个中等大小的和不正确的转储文件。 失败

编辑:在情况(1),回调返回成功=真。 在例(2)和(3),成功=假。 所以库知道它没有成功。 我想这是我的工作,找出失败的原因在我的目标。

如果我编译同样的测试程序,以我的生成计算机上运行,​​它运行并创建在所有情况下正确的转储文件。 即我已经成功地构建我的计算机上运行交叉编译Crashpad库和它的作品,因为它应该。 由于两个build和host 86,这是可能的。

例如我建立使用非交叉编译克++

g++ -g  mytest.cpp client/linux/libbreakpad_client.a -I. -lrt -lpthread -lboost_thread -o mytest

我的问题是:

  • 与Breakpad问题?

  • 是我的交叉编译库的问题?

  • 确实内核有所作为? 我是否需要启用任何特定的功能?

  • 这可怎么做工作? 即一个多线程的应用程序,在我的目标运行,产生一个正确的小型转储文件

Answer 1:

谷歌Breakpad将无法创建一个奔腾预III x86处理器一个小型转储。

奔腾III和上述包含由在一Breakpad呼叫sys_ptrace所请求的8个额外浮点寄存器。

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

在预先奔腾III处理器此调用将会失败,这将导致整个转储失败。



文章来源: Breakpad fails to create minidump on target when I use threads