相关疑难解决方法(0)

iOS上的可恢复断言/断点,如带有MS编译器的__debugbreak()

我正在尝试实现自定义资产宏(类似于assert.h所具有的),但我希望能够在获得并断言之后继续执行.

例如,一个这样的ASSERT实现可以是:

#define ASSERT(expr) ((void)( (!!(expr)) || (__debugbreak(), 0)))
Run Code Online (Sandbox Code Playgroud)

__debugbreak是Microsoft编译器中的一个内部函数,它插入了软件断点,相当于_asm int 3x86.对于iOS,有不同的方法来实现__debugbreak:

  • __asm__("int $3"); 对于x86.
  • __asm__("bkpt #0"); 对于常规手臂.
  • __asm__("brk #0"); for arm64
  • __builtin_trap()
  • raise(SIGTRAP)

但是当我的断言命中时,所有这些都不能简单地跨过并继续我在使用visual studio时可以做的事情; 当我的iOS构建中的某些东西断言它在断言时卡住了,我别无选择,只能终止,我甚至无法手动移动指令指针并跳过断言.

是否有可能在iOS上实现断言进入调试器并仍允许我继续执行的断言?

c c++ debugging assert ios

10
推荐指数
1
解决办法
490
查看次数

如何陷入调试器并继续使用iOS硬件?

在Mac OS X和iOS模拟器(均为x86)中,我们可以使用int3内联汇编中的指令陷阱到调试器(LLDB).这很好,因为它陷阱到特定的代码行,但我们可以通过在调试器中按下continue来立即继续.

有没有办法在iOS硬件上执行此操作?

对于一个较旧的问题的回答提到了raise(SIGINT)我所能看到的(从检查中signal.h)并不存在.另一个答案提到trap汇编指令,它会导致构建错误("无法识别的指令助记符").同样无法识别的是ARM文档中提到BKPT汇编指令.

我已经尝试__builtin_trap()了几乎,几乎做了我想要的,但不允许我继续.除非我使用jump +1或者手动推进指令指针,否则我会继续按下它register write pc `$pc+8\`,这比仅仅按下继续操作要方便得多.

我正在为使用Xcode 7.3.1的32位和64位设备构建iOS 9.任何帮助表示赞赏!

iphone debugging assembly breakpoints ios

6
推荐指数
1
解决办法
806
查看次数

XCode:以编程方式启用符号断点?

有没有办法以编程方式启用断点?通常我会使用断点条件,但我需要使用符号断点。

具体来说,contentOffset我的 UIScrollView 在调用scrollToIndexPath和调用之间发生了变化reloadData。我想仅在调用scrollToIndexPath.

xcode uiscrollview uikit ios lldb

5
推荐指数
1
解决办法
934
查看次数

标签 统计

ios ×3

debugging ×2

assembly ×1

assert ×1

breakpoints ×1

c ×1

c++ ×1

iphone ×1

lldb ×1

uikit ×1

uiscrollview ×1

xcode ×1