Breakpad не может создать мини-дамп на цели, когда я использую потоки

Я обнаружил, что мое тестовое приложение не создает правильный файл дампа при использовании потоков. Я использую кросс-компилятор для создания библиотеки Breadpad, которая затем связывается с моим кросс-компилятором для запуска на цели.

Я начну с объяснения моей настройки:

Основываясь на: Ubuntu 12.04, i686

Хост/цель: Vortex86DX, процессор i586, полностью настраиваемая система 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;
}

Я просто создаю варианты между сбоем из main() и сбоем из потока.

Наблюдения, когда я перекрестно компилирую и запускаю свое приложение на цели:

(1) тестовое приложение без потоков создаст правильный файл дампа на цели. ПРОХОДЯТ

(2) тестовое приложение с потоком, который дает сбой, создаст очень маленький и неправильный файл дампа (в основном нули) на цели. ПОТЕРПЕТЬ ПОРАЖЕНИЕ

(3) тестовое приложение с потоком, который не дает сбоев, и основным, который дает сбой, создаст неверный файл дампа среднего размера на цели. ПОТЕРПЕТЬ ПОРАЖЕНИЕ

РЕДАКТИРОВАТЬ: В случае (1) обратный вызов возвращает успешное = истинное. В случаях (2) и (3) успешно = ложь. Итак, библиотека знает, что это не удалось. Думаю, моя работа - выяснить, почему это не работает с моей целью.

Если я скомпилирую одно и то же тестовое приложение для запуска на своем компьютере сборки, оно запустится и создаст правильный файл дампа при любых обстоятельствах. т. е. я успешно запустил кросс-компилированную библиотеку Crashpad на своем компьютере для сборки, и она работает так, как должна. Поскольку и сборка, и хост являются x86, это возможно.

например Я строю, используя не кросс-компиляцию g++

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

Мои вопросы:

  • проблема с брейкпадом?

  • проблема с моими библиотеками кросс-компиляции?

  • ядро имеет значение? Нужно ли включать какие-то определенные функции?

  • как это можно заставить работать? то есть многопоточное приложение, работающее на моей цели, создает правильный файл минидампа


person Mr Stinky    schedule 06.09.2012    source источник


Ответы (1)


Google Breakpad не сможет создать минидамп на процессоре x86 до Pentium III.

Pentium III и выше содержат 8 дополнительных регистров с плавающей запятой, которые запрашиваются вызовом sys_ptrace в Breakpad.

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

На процессорах до Pentium III этот вызов завершится ошибкой, и это приведет к сбою всего минидампа.

person Mr Stinky    schedule 12.09.2012
comment
Мы определенно взяли бы патч для этого. Вы можете написать об этом в список рассылки google-breakpad-dev, и я помогу вам с процессом отправки патча. - person Ted Mielczarek; 29.01.2013
comment
Спасибо, жаль, что Rietveld имеет бесполезные настройки по умолчанию (не отправляет почту, поэтому никто не заметит ваш патч). - person Ted Mielczarek; 30.01.2013