2012-10-23 94 views
2
斷言後

是否有可能在Android NDK程序,它仍然允許該程序以恢復之後觸發從C++的GDB突破?繼續與Android NDK和GDB

含義,我打的斷言導致GDB停止程序,我希望能夠按Eclipse中的「播放」按鈕恢復程序,持續超越斷言。

現在我使用:

__asm__ ("bkpt 0"); 

這觸發了程序停止運行,並帶來了我的觸發它的代碼行,但不會讓我恢復之後。

GDB輸出在該程序暫停的時間以下。

(gdb) 
82 info signal SIGBUS 
&"info signal SIGBUS\n" 
~"Signal  Stop\tPrint\tPass to program\tDescription\n" 
~"SIGBUS  Yes\tYes\tYes\t\tBus error\n" 
82^done 
(gdb) 

如果我按「恢復」在這一點上,我得到的logcat的輸出如下:

Fatal signal 11 (SIGSEGV) at 0xfffffffd (code=1) 

也許我quesiton是如何扔非致命突破?

回答

2

,如果你的進程正在調試檢測的標準Linux的方法是:

if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1) 
    //Yes, we're running under GDB 

考慮到這一點,在調試的時候做一個條件艱苦斷點(bkpt 0),僅火災。

不知道如果在Android中Java的唯一調試會影響ptrace的。試一試。

編輯:調用raise(SIGABRT)打破。然後在GDB中輸入signal 0繼續。其他信號,如SIGINT和SIGTRAP也可能起作用。

+0

要澄清,我_不_尋找一種方法來完全跳過休息的時候沒有連接調試器。我希望能夠中斷,暫停進入調試器(此部分已經工作),然後有能力點擊「繼續」來恢復運行程序。現在,如果我嘗試在中斷後恢復,則會出現錯誤(將錯誤添加到原始問題中):致命信號11(SIGSEGV),位於0xfffffffd(代碼= 1)。 – Goose

+1

然後看[這裏](http://stackoverflow.com/questions/4326414/set-breakpoint-in-c-or-c-code-programmatically-for-gdb-on-linux)。 –

+0

就是這樣!我編輯了您的答案以包含該鏈接,並將其標記爲已回答。謝謝! – Goose