如何在LLDB下排查message sent to deallocated instance问题_百度知...

发布网友 发布时间:2022-04-24 10:06

我来回答

1个回答

热心网友 时间:2022-04-08 23:57

  谁实话,找了好久,好兴奋。


  在XCode的以前版本中,如果遇到了

  [代码]c#/cpp/oc代码:

  1    message sent to deallocated instance 0x6d5f0

  我们可以使用info malloc-history 0x6d5f0来查看调用堆栈来查看崩溃发生的地方,这种方法这里不作阐述,大家自行百度。

  在新的XCode里,调试器默认使用LLDB,我就讲一下如何在LLDB状态下定位到由于内存操作不当引起的Crash

  首先我有一段会发生崩溃的代码:

  [代码]c#/cpp/oc代码:

  1    NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];

  2    if(themePath)

  3      self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]];

  4

  5    [themePath release];

  学过内存管理的人都应该知道在这里themePath并没有被retain,所以如果写了release,那么必然会发生崩溃情况。首先我们需要对开发的环境变量进行设置

  运行代码,出现下面的崩溃现象

  下面我们打开“活动监视器”,找到我们对应的PID,我们的Target为HPThemeManager,只要找到HPThemeManager对应的PID就可以(HPThemeManager是在论坛里下载的,本来正在看代码,就直接拿他来作试验了)

  现在,我们得到了两个主要的信息:

  进程ID:50127

  崩溃地址:0x6d5f0

  我们打开终端,输入以下命令:

  [代码]c#/cpp/oc代码:

  1    sudo malloc_history 50127 0x6d5f0

  结果显示为:

  这样我们用能定位到这行代码

  [代码]c#/cpp/oc代码:

  1    NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];


  对themePath进行排查,就找到了崩溃的罪魁祸首

  [代码]c#/cpp/oc代码:

  1    [themePath release];
   

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com