我们知道php数组是hashtabe实现的,值是放在bucket里的。有没有人和我一样好奇如何在gdb里找出值的老家在哪里呢?

$cofing = array();
$config['name'] = "XiaoLi";

在gdb下查看
(gdb) p *config->value->ht->pListHead
$5 = {h = 7335516698733026337, nKeyLength = 21, pData = 0x7ffff7fc4248, pDataPtr = 0x7ffff7fc53e0, pListNext = 0x0, pListLast = 0x0, pNext = 0x0, pLast = 0x0,
arKey = 0x7ffff7ecace0 "TMPL_EXCEPTION_FILE2"}

本以为这个"XiaoLi"就藏在pData里
(gdb) p *config->value->ht->arBuckets[1]->pData
Attempt to dereference a generic pointer.

报错了,意思这是个通用指针,要转成zval才行,于是转了下

(gdb) p * (zval *)(config->value->ht->arBuckets[1]->pData)
$10 = {value = {lval = 140737353896928, dval = 6.9533491647073808e-310, str = {val = 0x7ffff7fc53e0 "@34201", len = 0}, ht = 0x7ffff7fc53e0, obj = {handle = 4160508896, handlers = 0x0}},
refcount__gc = 0, type = 0 '00', is_ref__gc = 0 '00'}

发现并没有找到我们的"XiaoLi",于是试了下pDataPtr 果然在里面
(gdb) p *(zval *)config->value->ht->pListHead->pDataPtr

$2 = {value = {lval = 140737352871232, dval = 6.9533491140312652e-310, str = {val = 0x7ffff7ecad40 "XiaoLi", len = 6}, ht = 0x7ffff7ecad40, obj = {handle = 4159483200,
handlers = 0x7fff00000006}}, refcount__gc = 1, type = 6 '06', is_ref__gc = 0 '00'}

看到没有,str = {val = 0x7ffff7ecad40 "XiaoLi", len = 6} 终于找到 "XiaoLi"的老巢了。

Comments are closed.

Post Navigation