【问题标题】:How to print self in debugger console on private method如何在调试器控制台中使用私有方法打印自我
【发布时间】:2014-02-24 18:11:15
【问题描述】:

这是我的异常堆栈跟踪。

#0  0x049f088a in objc_exception_throw ()
#1  0x05f933b5 in __NSFastEnumerationMutationHandler ()
#2  0x03046e9d in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#3  0x03047043 in __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke ()
#4  0x03046f14 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#5  0x03047043 in __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke ()
#6  0x03046f14 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#7  0x03046d3e in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:] ()
#8  0x03052187 in -[UIView(Internal) _addSubview:positioned:relativeTo:] ()
#9  0x03045846 in -[UIView(Hierarchy) insertSubview:atIndex:] ()
#10 0x02fde714 in __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke ()
#11 0x0304c3ef in +[UIView(Animation) performWithoutAnimation:] ()
#12 0x02fddc96 in -[_UINavigationParallaxTransition animateTransition:] ()
#13 0x03118e4e in -[UINavigationController _startCustomTransition:] ()
#14 0x031250c7 in -[UINavigationController _startDeferredTransitionIfNeeded:] ()
#15 0x03125cb9 in -[UINavigationController __viewWillLayoutSubviews] ()
#16 0x0325f181 in -[UILayoutContainerView layoutSubviews] ()
#17 0x03055267 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()
#18 0x04a0281f in -[NSObject performSelector:withObject:] ()
#19 0x023b12ea in -[CALayer layoutSublayers] ()
#20 0x023a50d4 in CA::Layer::layout_if_needed(CA::Transaction*) ()
#21 0x023a4f40 in CA::Layer::layout_and_display_if_needed(CA::Transaction*) ()
#22 0x0230cae6 in CA::Context::commit_transaction(CA::Transaction*) ()
#23 0x0230de71 in CA::Transaction::commit() ()
#24 0x0230e544 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
#25 0x05ecb4ce in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#26 0x05ecb41f in __CFRunLoopDoObservers ()
#27 0x05ea9344 in __CFRunLoopRun ()
#28 0x05ea8ac3 in CFRunLoopRunSpecific ()
#29 0x05ea88db in CFRunLoopRunInMode ()
#30 0x058939e2 in GSEventRunModal ()
#31 0x05893809 in GSEventRun ()
#32 0x02fead3b in UIApplicationMain ()
#33 0x000035f8 in main at /Users/dmueller39/Projects/ios-bloomberg/Bloomberg/main.mm:18

当我捕捉到这个时,我让调试器暂停了。如何在第 2 帧上打印 self 的值?

【问题讨论】:

    标签: objective-c xcode lldb


    【解决方案1】:

    您不能简单地通过在没有源代码的堆栈帧上键入 po self 来打印 self。

    您需要做的是打印正确的寄存器。

    在此处查看更多信息: http://www.clarkcox.com/blog/2009/02/04/inspecting-obj-c-parameters-in-gdb/

    确保选择您正在调试的正确架构(即,如果您的二进制文件是 32 位、64 位、arm、模拟器等)。

    【讨论】:

    • 这个答案正是我想要的。如果我可以这么大胆,请问您阅读了哪些技术博客?
    • 在 lldb 中,这通过为参数寄存器设置伪寄存器名称来简化一点,p/x $arg1 等(在 armv7、x86_64、arm64 上,args 在 regs 中传递)将显示它们。但是对于回溯中间的堆栈帧,您将不得不反汇编函数并查看参数的保存位置(如果它保存在任何地方)......一旦调用另一个函数,arg 传递寄存器被重复用于不同的值。 lldb 甚至不会在堆栈中间向您显示它们,因为它知道它们已被破坏。你真的需要在函数的开头。
    【解决方案2】:

    (lldb) frame select 2
    
    (lldb) po self
    

    为你工作?

    【讨论】:

    • 不能这样工作,抱歉。除非有源代码,否则您需要在寄存器中查找变量。
    • 你说得对 - 我没有意识到他那里没有那些框架的调试信息。这就是为什么人们应该更仔细地看问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2023-03-23
    • 2023-01-14
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多