LLDB如何打印跟踪C数组的值?

已知当前断点处调用的OC函数是“+[NSDictionary dictionaryWithObjects: forKeys: count:]”,断点处几个重要的寄存器值如下:

我想打印出x1,x2对应的数组值,这两个寄存器存储的应该是c数组的指针,那如何将其对应的数组完整值打印出来呢?

另外,这两个数组值应该是分配在堆栈上的,如何跟踪他们的值变化,比如说x2对应的数组,我想跟踪出它是什么时候生成的?

po $x2
po $x3

回去测试了下(从c/c++ 分析思路 出发的,你可以看看):

本质来讲,这个 字典结构 其实就是 :
字典地址 :{
pointer key1; <key数组地址>
pointer key2;
pointer key3;

pointer value1;<value数组地址>
pointer value2;
pointer value3;

}

po 试了无效 打印出来都是4372495668 这样的数字

这两个是指针

那就 p (char *)$x2
p (char * )$x3

…两个轮着来,年纪大了,记忆力佬退化了。多试试,才知道
按理来说 x2 是obj的呀,x3 都keys…很像数组对象了…
不是对象的话,就 x/8xg $x3 查看下 x3 寄存器对应的地址里 8个 64位值

如果里面存的是字符串地址的话, 直接 p (char *) xxxx // xxx 是上面的 指令 显示的地址

具体指令,这里赋值黏贴
lldb官网

  • 全方位多角度告诉你
(lldb) po [NSDictionary dictionaryWithObjects:(id *)$x2 forKeys:(id *)$x3 count:$x4]
{
    HighFrequency = 0;
    bundleID = "youdaoPro.test.w";
    pid = 2736;
}

(lldb) po *(int **)($x2)
youdaoPro.test.w

(lldb) po *(int **)($x2+8)
2736

(lldb) po *(int **)($x2+16)
0

(lldb) po *(int **)($x3+16)
HighFrequency

(lldb) po *(int **)($x3+8)
pid

(lldb) po *(int **)($x3)
bundleID

(lldb) p $x4
(unsigned long) $39 = 3
(lldb) 

7 个赞

牛皮了,这个 *(int **) 好骚

爱了 这些骚操作 :smiley:

骚操作真好,学会了

非常感谢大佬,为什么用*(int **),请问是怎么考虑的呀?

真的sao