2012-09-06 22 views
1

我發現當我使用線程時,測試應用程序不會生成正確的轉儲文件。我使用交叉編譯器來構建麪包板庫,然後將其與我的交叉編譯器鏈接以在目標上運行。當我使用線程時,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問題?

  • 是我的交叉編譯庫的問題?

  • 內核是否有所作爲?我是否需要啓用任何特定的功能?

  • 這怎麼能工作?即在我的目標上運行的多線程應用程序生成正確的轉儲文件

回答

1

Google Breakpad無法在Pentium III前處理器上創建小型轉儲。

Pentium III及更高版本包含8個額外的浮點寄存器,由Breakpad中的sys_ptrace調用請求。

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

在Pentium III之前的處理器上,這個調用會失敗,這會導致整個小型轉儲失敗。

+0

我們肯定會爲此做一個補丁。您可以發佈到google-breakpad-dev郵件列表,我可以幫助您完成補丁提交過程。 –

+0

我在4個月前提交了補丁。 https://breakpad.appspot.com/455002/ –

+0

謝謝,對不起,Rietveld有無用的默認值(不發送郵件,所以沒人注意到你的補丁)。 –

相關問題