首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在lldb中跳过objc_msgSend函数?

如何在lldb中跳过objc_msgSend函数?
EN

Stack Overflow用户
提问于 2016-12-28 11:13:13
回答 3查看 562关注 0票数 1

在目标-c中,把cal函数转换为objc_msgSend.例如:

代码语言:javascript
复制
[foo doSomething:@"keke"]

被翻译成

代码语言:javascript
复制
objc_msgSend(foo, "doSomething:", @"keke")

如何在lldb中调试时直接转到foo.doSomething:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-04 02:18:35

11 does确实提供了可以控制step逻辑的线程计划。

代码语言:javascript
复制
class GotoUser:
    def __init__ (self, thread_plan, dict):
        self.start_time = time.time()
        self.thread_plan = thread_plan
        target = self.thread_plan.GetThread().GetProcess().GetTarget();
        module = target.GetModuleAtIndex(0)
        sbaddr = lldb.SBAddress(module.GetObjectFileHeaderAddress())
        self.start_address = sbaddr.GetLoadAddress(target)
        module = target.GetModuleAtIndex(1)
        sbaddr = lldb.SBAddress(module.GetObjectFileHeaderAddress())
        self.end_address = sbaddr.GetLoadAddress(target)
        print "start addr: ", hex(self.start_address), " end addr: ", hex(self.end_address)

    def explains_stop (self, event):
        if self.thread_plan.GetThread().GetStopReason()== lldb.eStopReasonTrace:
            return True
        else:
            return False

    def should_stop (self, event):
        cur_pc = self.thread_plan.GetThread().GetFrameAtIndex(0).GetPC()
        if cur_pc >= self.start_address and cur_pc <= self.end_address:
            self.thread_plan.SetPlanComplete(True)
            print 'time used ', (time.time() - self.start_time)
            return True
        else:
            return False

    def should_step (self):
        return True

创建一个python脚本,将其加载到lldb。运行thread step-scripted gotouser.GotoUser

任务完成。

完整源代码:https://github.com/Jichao/lldb-scripts/blob/master/gotouser.py

内置于lldb:https://github.com/Jichao/lldb中的版本

票数 0
EN

Stack Overflow用户

发布于 2017-01-10 00:49:13

使用Python线程计划是很聪明的!但是,您不应该对ObjC消息这样做。lldb知道objc_msgSend &其他几个是ObjC消息的分派函数。因此,如果一个step in在objc_msgSend结束时,lldb将从传入的对象/选择器对中找出方法实现,在那里设置一个断点,然后继续。

例如:

代码语言:javascript
复制
(lldb) run
Process 55502 launched: '/private/tmp/trivial' (x86_64)
Process 55502 stopped
* thread #1: tid = 0x32619ba, function: main , stop reason = breakpoint 1.1
    frame #0: 0x0000000100000f28 trivial`main at trivial.m:18
   15   main()
   16   {
   17     Trivial *my_foo = [[Trivial alloc] init];
-> 18     [my_foo doSomething];
   19     return 0;
   20   }
(lldb) s
Process 55502 stopped
* thread #1: tid = 0x32619ba, function: -[Trivial doSomething] , stop reason = step in
    frame #0: 0x0000000100000ed7 trivial`-[Trivial doSomething] at trivial.m:10
   7    @implementation Trivial
   8    - (void) doSomething
   9    {
-> 10     NSLog(@"%@ called doSomething.", self);
   11   }
   12   @end
   13   

因此,在这种情况下,实际的消息接收方停止了该步骤。如果这不是您正在发生的事情,那么最有可能的事情就是欺骗了lldb中执行对象/选择器->实现查找的部分。我必须更多地了解你的代码,才能弄清楚为什么会这样。

票数 0
EN

Stack Overflow用户

发布于 2022-04-25 07:23:57

如何在lldb中调试时直接转到foo.doSomething:?

似乎:没有占有权

  • 解决办法:添加相关断点
代码语言:javascript
复制
- your here: `-[foo doSomething:]`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41360874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档