2012-03-30 50 views
0

我編寫了一個簡單的NDK程序,它有一個在另一個線程中運行的記錄器。由SIGSEGV殺死的NDK程序

我的程序運行成功,但之後程序退出,有時在運行我的C++代碼後無法退出並正常工作。 任何人都知道爲什麼我的程序在運行代碼後退出。

當我使用strace的調試我的程序,它告訴我+++由SIGSEGV +++

semget(0x1c, 0xbe9222e8, 0x10, 0xffffffff) = -1 EINTR (Interrupted system call) 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
msgget(0x1, 0xbe922430, 0x418fce8c, 0xa8121b40) = 0 
semget(0x1c, 0xbe9222e8, 0x10, 0xffffffff) = -1 EINTR (Interrupted system call) 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
--- SIGSTOP (Stopped (signal)) @ 0 (0) --- 
msgget(0x1, 0xbe922430, 0x418fce8c, 0xa8121b40) = 0 
semget(0x1c, 0xbe9222e8, 0x10, 0xffffffff <unfinished ...> 
+++ killed by SIGSEGV +++ 

殺死如果我禁用了線程的一切工作正常,也許與logcat的另一個線程記錄是不是安全

+0

它看起來好像你的C++代碼提交了段錯誤,但有很多原因,如果沒有你的代碼的進一步信息和示例,這些不容易被發現。可能很簡單,你只需要確保你的記錄器線程已經停止並且在主程序退出之前被銷燬**,否則它可能在內部引用一些不再有效的引用的內存,即主線程已經消失,並且操作系統現在會在記錄器嘗試訪問某些內存時對其進行段錯誤檢測。但是,沒有代碼和更多信息,這很難確定。 – waxspin 2012-03-30 19:28:11

+0

@waxspin:謝謝你的回覆。我在這裏鏈接到我的代碼。我希望你能幫助我。 [thread](http://kge.svn.sourceforge.net/viewvc/kge/trunk/engine/KGEmain/KgeThread.cpp?revision=613&view=markup)[logger](http://kge.svn.sourceforge。 net/viewvc/kge/trunk/engine/KGEmain/Logger.cpp?revision = 609&view = markup)[my test code](http://kge.svn.sourceforge.net/viewvc/kge/trunk/tests/01% 20Logger%20test/main.cpp?revision = 606&view = markup)我的項目是跨平臺的,用KGE_PLATFORM_ANDROID預處理器 – kochol 2012-03-31 04:45:58

回答

0

@waxspin 你說得對,我的程序在我的記錄器線程被銷燬之前退出。