代码之家  ›  专栏  ›  技术社区  ›  Andrew Grant

xcode等价于“uu asm int 3/debugbreak()/halt”?

  •  20
  • Andrew Grant  · 技术社区  · 16 年前

    在Xcode中造成硬中断的指令是什么?例如,在Visual Studio下,我可以执行“asm int 3”或“debugbreak()”。在某些GCC实现中,它是asm(“break 0”)或asm(“trap”)。

    我在Xcode下尝试过各种组合,但没有任何运气。(内联汇编程序工作正常,因此不是语法问题)。

    这是一个断言宏的引用。我不想将assert.h中的定义用于可移植性,因为它们似乎在xcode提供的版本中执行abort()。


    约翰-超级,干杯。作为参考,int 3语法是英特尔Mac和iPhone所需的语法。


    Chris-谢谢您的评论,但是有很多原因可以避免将代码库移植到不同平台的标准assert()函数。如果您遇到了滚动自己断言的麻烦,通常是因为您希望保留其他功能(日志记录、堆栈展开、用户交互)。

    您建议尝试通过实现“uu断言”或类似的方法来替换处理程序,但这并不具有可移植性。标准的“assert”通常是一个宏,虽然它可以映射到Mac上的“assert”,但它不在其他平台上。

    7 回复  |  直到 16 年前
        1
  •  21
  •   John Millikin    16 年前

    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.
    
        2
  •  10
  •   Chris Hanson    16 年前

    您只需将呼叫插入到 Debugger() 这将在调试器中停止您的应用程序(如果它正在调试器下运行),或者在不运行的情况下停止它,并引发异常。

    也, 不要回避 assert() 因为“可移植性原因” 可移植性就是它存在的原因!它是标准C的一部分,您可以在找到C编译器的任何地方找到它。你真正想做的是定义一个新的 断言处理程序 这会导致调试器中断而不是调用 abort() ;几乎所有的C编译器都提供了一种机制,通过这种机制您可以做到这一点。

    通常,这是通过简单地实现一个遵循此原型的函数或宏来实现的:

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

    当断言表达式失败时调用。通常不是 断言() 它本身就是 printf() 然后 中止() “这是默认的记录行为。通过自定义此函数或宏,可以更改其行为。

        3
  •  3
  •   Steven Kramer    13 年前

    对于后代:我有一些代码可以在调试器中的正确堆栈帧处生成停顿,并(可选)暂停应用程序,以便您可以及时附加调试器。适用于模拟器和设备(也可能是台式机,如果您需要的话)。详尽详细的职位 http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

        4
  •  3
  •   Tod    12 年前
        5
  •  2
  •   GateKiller    16 年前

    我在一个 Apple Forum :

    Xcode没有内置任何符号中断,但它们是 快速添加。转到“断点”窗口并添加:

    -[例外情况提高]

        6
  •  2
  •   Sonny Saluja    13 年前
    kill(getpid(), SIGINT);
    

    在模拟器和设备中工作。

        7
  •  1
  •   logancautrell    13 年前

    还有以下函数可用作跨平台的直接暂停()替代:

    #include <stdlib.h>
    
    void abort(void);
    

    我们在跨平台引擎中使用它来实现iPhone,以防出现致命的断言。跨越任天堂DS/Wii/Xbox 360/iOS等平台…