2008-09-01 52 views
17

什麼是導致Xcode硬解的指令?例如在Visual Studio中,我可以執行'_asm int 3'或'DebugBreak()'。在一些GCC實現下,它是asm(「break 0」)或asm(「trap」)。Xcode相當於'__asm int 3/DebugBreak()/ Halt?

我試過Xcode下的各種組合,沒有任何運氣。 (內聯彙編工作正常,所以它不是一個語法問題)。

僅供參考,適用於斷言宏。我不想使用assert.h中的定義來實現可移植性,並且因爲它們似乎在XCode提供的版本中執行了abort()。


約翰 - 超級,歡呼聲。作爲參考,INT 3語法是英特爾Mac和iPhone所需的語法。


克里斯 - 感謝您的評論,但有很多原因,以避免移植到不同平臺的代碼庫標準的assert()函數。如果你遇到了自己斷言的麻煩,那通常是因爲你有更多的功能(記錄,堆棧展開,用戶交互),你希望保留這些功能。

您嘗試通過的實現更換投手的建議「__assert」或類似的不會是便攜的,標準的‘斷言’通常是一個宏,雖然它可以映射到__assert沒有關係的Mac上」 :T在其他平臺上

回答

18

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}   ; Halts a program running on PPC32 or PPC64. 

__asm {int 3}   ; Halts a program running on IA-32. 
+6

隨着GCC /鐺ASM語法,這成爲'__asm __( 「INT $ 3」)`英特爾Macs和(可能)`__asm __( 「陷阱」)`進行的iDevices。 – zneak 2012-10-28 22:01:50

+1

上面的鏈接現在似乎已經死了。 – rstackhouse 2015-01-21 17:35:56

2

我發現在Apple Forum如下:

Xcode中沒有附帶內置的任何象徵性的突破 - 但他們 快速補充轉到斷點窗口add:

- [N SException加薪]

10

您可以直接插入到Debugger()通話 - 將在調試器停止你的應用程序(如果它正在調試器下運行),或與異常停止它如果不是。

此外,爲「便攜性的原因」不避免assert() - 便攜性是它存在的原因!它是標準C的一部分,無論您在哪裏找到C編譯器,都可以找到它。你真正想要做的是定義一個新的斷言處理程序,它執行調試程序中斷,而不是調用abort();幾乎所有的C編譯器都提供了一個可以做到這一點的機制。

通常,這是通過簡單地執行下面這個原型的函數或宏來完成:

void __assert(const char *expression, const char *file, int line); 

當斷言表達失敗這就是所謂的。通常它不是assert()本身,它執行的是「printf()後跟abort()」,這是默認的記錄行爲。通過自定義此功能或宏,您可以更改其行爲。

+2

在故障線路上放入調試器的便攜方式是什麼? assert()將你放入庫代碼中... – JBRWilkinson 2011-10-05 17:41:44

+1

感謝Chris,但是第一個 - Debugger()在頭文件中被標記爲「已棄用」,沒有任何替代方向,第二 - 我不知道要連接什麼,在爲了獲得它 - 正常的「可可」和「CoreFoundation」框架沒有它 - 我有一個鏈接錯誤_Debugger – 2016-01-14 08:29:38

1

還有以下功能是作爲跨平臺的直線停止()的替代:

#include <stdlib.h> 

void abort(void); 

我們的致命斷言情況下使用它在我們的跨平臺引擎的iPhone實現。跨越任天堂DS/Wii/XBOX 360/iOS等的跨平臺...

2
kill(getpid(), SIGINT); 

在模擬器和設備中工作。