已知当前断点处调用的OC函数是“+[NSDictionary dictionaryWithObjects: forKeys: count:]”,断点处几个重要的寄存器值如下:
我想打印出x1,x2对应的数组值,这两个寄存器存储的应该是c数组的指针,那如何将其对应的数组完整值打印出来呢?
另外,这两个数组值应该是分配在堆栈上的,如何跟踪他们的值变化,比如说x2对应的数组,我想跟踪出它是什么时候生成的?
已知当前断点处调用的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)
牛皮了,这个 *(int **) 好骚
爱了 这些骚操作
骚操作真好,学会了
非常感谢大佬,为什么用*(int **),请问是怎么考虑的呀?
真的sao