Я обнаружил, что мое тестовое приложение не создает правильный файл дампа при использовании потоков. Я использую кросс-компилятор для создания библиотеки 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
Мои вопросы:
проблема с брейкпадом?
проблема с моими библиотеками кросс-компиляции?
ядро имеет значение? Нужно ли включать какие-то определенные функции?
как это можно заставить работать? то есть многопоточное приложение, работающее на моей цели, создает правильный файл минидампа