我發現當我使用線程時,測試應用程序不會生成正確的轉儲文件。我使用交叉編譯器來構建麪包板庫,然後將其與我的交叉編譯器鏈接以在目標上運行。當我使用線程時,Breakpad無法在目標上創建小型轉儲程序
我將解釋開始我的設置:
大廈: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
運行的二進制文件I交叉編譯我的測試應用程序,像這樣:
$ /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)測試程序,沒有線程,將創建目標正確的轉儲文件。 PASS
(2)測試應用程序,如果線程崩潰,將在目標上創建一個非常小且不正確的轉儲文件(大多數爲零)。失敗
(3)測試應用程序(帶有一個不會崩潰的線程和一個崩潰的主體)將在目標上創建一箇中等大小且不正確的轉儲文件。失敗
編輯:在情況下(1),回調返回成功=真。在情況(2)和(3)中,成功=假。所以圖書館知道它沒有成功。我想我的工作是找出爲什麼它在我的目標上失敗。
如果我編譯相同的測試應用程序以在構建計算機上運行,它將運行並在所有情況下創建正確的轉儲文件。即我已經成功地在我的編譯計算機上運行交叉編譯的Crashpad庫,並且它可以正常工作。由於build和host都是x86,所以這是可能的。
例如我建立使用非交叉編譯G ++
g++ -g mytest.cpp client/linux/libbreakpad_client.a -I. -lrt -lpthread -lboost_thread -o mytest
我的問題是:
與Breakpad問題?
是我的交叉編譯庫的問題?
內核是否有所作爲?我是否需要啓用任何特定的功能?
這怎麼能工作?即在我的目標上運行的多線程應用程序生成正確的轉儲文件
我們肯定會爲此做一個補丁。您可以發佈到google-breakpad-dev郵件列表,我可以幫助您完成補丁提交過程。 –
我在4個月前提交了補丁。 https://breakpad.appspot.com/455002/ –
謝謝,對不起,Rietveld有無用的默認值(不發送郵件,所以沒人注意到你的補丁)。 –