Ios Xcode LLDB断点条件-我可以在C函数值上中断吗?
iOS SDK警告我某些代码(可能是我正在使用的第三方API)正在使用Ios Xcode LLDB断点条件-我可以在C函数值上中断吗?,ios,c,debugging,breakpoints,lldb,Ios,C,Debugging,Breakpoints,Lldb,iOS SDK警告我某些代码(可能是我正在使用的第三方API)正在使用nil上下文进行CG调用 因此,我想在其中一个调用上设置一个符号断点,并在传递的上下文为nil时使其中断。例如,如果使用nil上下文调用CGContextSetBlendMode(context,mode) 我创建了一个条件为context==nil的符号断点,但调试器一直告诉我这是一个无效条件 有没有人使用断点和条件来停止C函数的调用?您是如何指定条件的 您应该只在CGPostError上创建符号断点 请参见您应该在CGPo
nil
上下文进行CG调用
因此,我想在其中一个调用上设置一个符号断点,并在传递的上下文为nil
时使其中断。例如,如果使用nil
上下文调用CGContextSetBlendMode(context,mode)
我创建了一个条件为context==nil
的符号断点,但调试器一直告诉我这是一个无效条件
有没有人使用断点和条件来停止C函数的调用?您是如何指定条件的 您应该只在
CGPostError
上创建符号断点
请参见您应该在
CGPostError
上创建符号断点
请参见是,您可以根据C函数的结果设置条件断点。但是,听起来您希望找到任何具有nil上下文的核心图形调用。只有在代码的特定行上设置断点时,条件断点才起作用
另一位发帖人建议在CGPostError上设置一个符号断点,这听起来像是一种方法。是的,您可以根据C函数的结果设置一个条件断点。但是,听起来您希望找到任何具有nil上下文的核心图形调用。只有在代码的特定行上设置断点时,条件断点才起作用
另一张海报建议在CGPostError上设置一个符号断点,这听起来是个不错的选择。关于大多数编译器生成的调试信息(包括gcc和clang),有一点不太明显,那就是在定义函数时,只会生成函数的调试信息,不是在它使用的所有模块中。这只是为了防止调试信息变得难以管理 这意味着,即使您的代码包含定义CGContextSetBlendMode的CoreGraphics头,您仍然没有函数CGContextSetBlendMode的调试信息。调试器可以从动态链接器用于绑定调用的信息中看到符号名,因此可以在其上设置断点,但它不知道“上下文”是什么意思。这就是你的条件无效的原因,它引用了一个未知的名称 如果在第一个参数为nil时仍要中断CGContextSetBlendMode,则需要确定调用函数时函数的第一个参数存储在何处。如果它存储在寄存器中(对于ARM和x86_64为true,而不是i386),则lldb具有方便变量:$arg1、$arg2等,它们是前几个参数传递寄存器的别名。因此,对于ARM,您应该能够使用以下条件:
$arg1 == nil
请注意,参数传递寄存器通常只保存函数开头的实际参数值。不要试图在函数中间使用它们,因为这些寄存器很可能在那个时候被重用。 < P>大多数编译器生成的调试信息(包括GCC和CLAN)的一个稍微不明显的东西是在函数定义的点上只生成函数的调试信息,不是在它使用的所有模块中。这只是为了防止调试信息变得难以管理 这意味着,即使您的代码包含定义CGContextSetBlendMode的CoreGraphics头,您仍然没有函数CGContextSetBlendMode的调试信息。调试器可以从动态链接器用于绑定调用的信息中看到符号名,因此可以在其上设置断点,但它不知道“上下文”是什么意思。这就是你的条件无效的原因,它引用了一个未知的名称 如果在第一个参数为nil时仍要中断CGContextSetBlendMode,则需要确定调用函数时函数的第一个参数存储在何处。如果它存储在寄存器中(对于ARM和x86_64为true,而不是i386),则lldb具有方便变量:$arg1、$arg2等,它们是前几个参数传递寄存器的别名。因此,对于ARM,您应该能够使用以下条件:
$arg1 == nil
请注意,参数传递寄存器通常只保存函数开头的实际参数值。不要试图在函数中间使用它们,因为这些寄存器很可能在那个时候被重用。这个问题提供了我想要的答案。这不是我的密码:-)谢谢。这个问题提供了我想要的答案。这不是我的代码:-)谢谢,我怀疑能做到这一点会派上用场。谢谢,我怀疑能做到这一点会派上用场。