iOS SDK向我发出警告,说明正在使用nil
上下文进行CG调用的某些代码(可能是我正在使用的某些第三方API)。
所以我想在其中一个调用上设置一个符号断点,并在传递的上下文为nil
时使其中断。例如,如果使用CGContextSetBlendMode(context, mode)
上下文调用nil
。
我创建了一个条件为context == nil
的符号断点,但是调试器一直告诉我这是一个无效的条件。
是否有人使用断点和条件来停止C函数调用?你是如何指定条件的?
答案 0 :(得分:2)
大多数编译器生成的调试信息(包括gcc& clang)的一个稍微不明显的事情是,只有在定义函数的位置生成函数的调试信息,而不是在所有模块中生成它的调试信息用过的。这只是为了防止调试信息变得难以管理。
这意味着即使您的代码包含定义CGContextSetBlendMode的CoreGraphics标头,您仍然没有函数CGContextSetBlendMode的调试信息。调试器可以从动态链接器用于绑定调用的信息中看到符号名称,因此它可以在其上设置断点,但它不知道“上下文”的含义。这就是为什么你的病情无效,它指的是一个未知的名字。
如果你仍想在第一个参数为nil时打破CGContextSetBlendMode,你需要弄清楚在调用函数时函数的第一个参数的存储位置。如果它存储在寄存器中(对于ARM和x86_64,而不是i386,则为true),则lldb具有便捷变量:$ arg1,$ arg2等,它们是前几个参数传递寄存器的别名。因此对于ARM,您应该能够使用条件:
$arg1 == nil
请注意,传递寄存器的参数通常只保存函数开头的实际参数值。不要试图在函数中间使用它们,因为这些寄存器很可能在那时被重用。
答案 1 :(得分:1)
您应该在CGPostError
上创建符号断点。
答案 2 :(得分:1)
是的,您可以根据C函数的结果设置条件断点。但是,听起来您想要使用nil上下文找到任何Core Graphics调用。只有在代码的特定行上设置断点时,条件断点才有效。
另一张海报关于CGPostError上符号断点的建议听起来像是要走的路。