日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php symbol table,gdb方式遍历EG(symbol_table) 哈希表的key_PHP教程

發(fā)布時間:2025/3/15 php 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php symbol table,gdb方式遍历EG(symbol_table) 哈希表的key_PHP教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Sara Golemon寫過一篇文章,里面提到:“是否存在特別的地方可以找到GLOBALS數(shù)組?”答案是“存在”,就是EG(symbol_table)-Executor Globals結(jié)構(gòu),她也給出了找的具體實例,如下

PHP_FUNCTION(confirm_getGlobal_compiled) {

char *varname;

int varname_len;

zval **varvalue;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “s”, &varname, &varname_len) == FAILURE) {

RETURN_NULL();

}

if (zend_hash_find(&EG(symbol_table), varname, varname_len + 1, (void**)&varvalue) == FAILURE) {

php_error_docref(NULL TSRMLS_CC, E_NOTICE, “Undefined variable: %s”, varname);

RETURN_NULL();

}

*return_value = **varvalue;

zval_copy_ctor(return_value);

}

編譯成so加載后,編寫php測試代碼

$abc = ‘string’;

$def = ‘string2’;

var_dump(confirm_getGlobal_compiled(‘a(chǎn)bc’));

執(zhí)行結(jié)果

string(6) “string”

大家可能感覺奇怪,為什么多寫了一個def變量,這就是下面要進行的,一起來看下EG這個hashtable

gdb –args bin/php -c php.ini a.php

調(diào)試代碼如下

(gdb) b renzhi.c : 301 //在寫的擴展地方加上斷點

No source file named renzhi.c.

Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (renzhi.c : 301) pending.

(gdb) r //運行到斷點處

Starting program: /root/php-src-5.3/bin/php -c php.ini ceshi.php

warning: .dynamic section for “/lib/libc.so.6” is not at the expected address

warning: difference appears to be caused by prelink, adjusting expectations

[Thread debugging using libthread_db enabled]

Breakpoint 1, zif_confirm_getGlobal_compiled (ht=1, return_value=0x837a43c, return_value_ptr=0x0, this_ptr=0x0, return_value_used=1)

at /root/php-src-5.3/ext/renzhi/renzhi.c:305

305 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “s”, &varname, &varname_len) == FAILURE) {

(gdb) n

309 if (zend_hash_find(&EG(symbol_table), varname, varname_len + 1, (void**)&varvalue) == FAILURE) {

(gdb) step //進入zend_hash_find哈希查找函數(shù)

zend_hash_find (ht=0x82e3250, arKey=0x837a42c “abc”, nKeyLength=4, pData=0xbfffc484) at /root/php-src-5.3/Zend/zend_hash.c:872

下面看下關(guān)鍵

(gdb) p *ht

$9 = {nTableSize = 64, nTableMask = 63, nNumOfElements = 10, nNextFreeElement = 0, pInternalPointer = 0x83edc98, pListHead = 0x83edc98,

pListTail = 0x837a3fc, arBuckets = 0x83705a8, pDestructor = 0x81923b0 , persistent = 0 ’00’, nApplyCount = 0 ’00’,

bApplyProtection = 1 ’01’}

(gdb) p *ht.pListHead

$2 = {h = 2572561225, nKeyLength = 8, pData = 0x83edca4, pDataPtr = 0x83edc7c, pListNext = 0x8378c4c, pListLast = 0x0, pNext = 0x0, pLast = 0x0,

arKey = “G”}

(gdb) p *ht.pListHead.pListNext

$3 = {h = 253399445, nKeyLength = 5, pData = 0x8378c58, pDataPtr = 0x8378b60, pListNext = 0x8378c7c, pListLast = 0x83edc98, pNext = 0x0, pLast = 0x0,

arKey = “a”}

(gdb) p *ht.pListHead.pListNext.pListNext

$4 = {h = 253398818, nKeyLength = 5, pData = 0x8378c88, pDataPtr = 0x8378c30, pListNext = 0x8378d20, pListLast = 0x8378c4c, pNext = 0x0, pLast = 0x0,

arKey = “a”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext

$5 = {h = 3947724458, nKeyLength = 6, pData = 0x8378d2c, pDataPtr = 0x8378cac, pListNext = 0x8378d54, pListLast = 0x8378c7c, pNext = 0x0, pLast = 0x0,

arKey = “_”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext

$6 = {h = 249444164, nKeyLength = 5, pData = 0x8378d60, pDataPtr = 0x83edd1c, pListNext = 0x8378d84, pListLast = 0x8378d20, pNext = 0x0, pLast = 0x0,

arKey = “_”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext

$7 = {h = 195471710, nKeyLength = 8, pData = 0x8378d90, pDataPtr = 0x83edd38, pListNext = 0x8378e2c, pListLast = 0x8378d54, pNext = 0x0, pLast = 0x0,

arKey = “_”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$8 = {h = 1027153623, nKeyLength = 7, pData = 0x8378e38, pDataPtr = 0x8378db8, pListNext = 0x8379e8c, pListLast = 0x8378d84, pNext = 0x0, pLast = 0x0,

arKey = “_”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$9 = {h = 3291685243, nKeyLength = 8, pData = 0x8379e98, pDataPtr = 0x8378e88, pListNext = 0x837a3cc, pListLast = 0x8378e2c, pNext = 0x0, pLast = 0x0,

arKey = “_”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$10 = {h = 2090069483, nKeyLength = 4, pData = 0x837a3d8, pDataPtr = 0x8379ef8, pListNext = 0x837a3fc, pListLast = 0x8379e8c, pNext = 0x0, pLast = 0x0,

arKey = “a”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$11 = {h = 2090180660, nKeyLength = 4, pData = 0x837a408, pDataPtr = 0x8379edc, pListNext = 0x0, pListLast = 0x837a3cc, pNext = 0x0, pLast = 0x0,

arKey = “d”}

有點亂,這里第一條就是現(xiàn)實了EG這個hash表里面有nNumOfElements =10個元素

這里的

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$10 = {h = 2090069483, nKeyLength = 4, pData = 0x837a3d8, pDataPtr = 0x8379ef8, pListNext = 0x837a3fc, pListLast = 0x8379e8c, pNext = 0x0, pLast = 0x0,

arKey = “a”}

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$11 = {h = 2090180660, nKeyLength = 4, pData = 0x837a408, pDataPtr = 0x8379edc, pListNext = 0x0, pListLast = 0x837a3cc, pNext = 0x0, pLast = 0x0,

arKey = “d”}

就是測試php代碼里面的

$abc = ‘string’;

$def = ‘string2’;

這兩個變量名稱的具體hash的bucket了

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$10 = {h = 2090069483, nKeyLength = 4, pData = 0x837a3d8, pDataPtr = 0x8379ef8, pListNext = 0x837a3fc, pListLast = 0x8379e8c, pNext = 0x0, pLast = 0x0,

arKey = “a”}

第一個字符arKey為a,有nKeyLength = 4四個字符長度

(gdb) p ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.arKey[0]

$10 = 97 ‘a(chǎn)’

(gdb) p ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.arKey[1]

$11 = 98 ‘b’

(gdb) p ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.arKey[2]

$12 = 99 ‘c’

(gdb) p ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.arKey[3]

$13 = 0 ’00’

如何在gdb方式下拿到指針了,看到對應(yīng)的執(zhí)行的zval的內(nèi)容呢?

已經(jīng)知道了bucket結(jié)構(gòu)體中的pData就執(zhí)行了內(nèi)容

(gdb) p ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pData

$19 = (void *) 0x837a3d8

但是返回的這個,還不知道如何獲得,請高手幫助

搞明白了

(gdb) p *ht.pListHead.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext.pListNext

$29 = {h = 2090069483, nKeyLength = 4, pData = 0x839fe28, pDataPtr = 0x839f948, pListNext = 0x839fe4c, pListLast = 0x839f8dc, pNext = 0x0, pLast = 0x0,

arKey = “a”}

(gdb) p *(zval *)$29->pDataPtr

$30 = {value = {lval = 138024112, dval = 1.2800167717828578e-313, str = {val = 0x83a14b0 “string”, len = 6}, ht = 0x83a14b0, obj = {handle = 138024112,

handlers = 0x6}}, refcount__gc = 1, type = 6 ’06’, is_ref__gc = 0 ’00’}

哈哈,可以看到具體的hash指向的值了

但是又有點不明白了pData和pDataPtr到底有啥關(guān)系?

(gdb) p &$29->pDataPtr

$46 = (void **) 0x839fe28

(gdb) p $29->pData

$47 = (void *) 0x839fe28

也就是pData里面存得是pDataPtr的地址

摘自 xiaoq3406的專欄

www.bkjia.comtrueTechArticleSara Golemon寫過一篇文章,里面提到:是否存在特別的地方可以找到GLOBALS數(shù)組?答案是存在,就是EG(symbol_table)-Executor Globals結(jié)構(gòu),她也給出…

總結(jié)

以上是生活随笔為你收集整理的php symbol table,gdb方式遍历EG(symbol_table) 哈希表的key_PHP教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美国成人免费视频 | 88xx成人永久免费观看 | 无人在线观看的免费高清视频 | 99热热99| 成人免费视频网站 | 色综合久久中文字幕无码 | 国产精品久久久 | 印度午夜性春猛xxx交 | 成人午夜视频免费观看 | 九九欧美| 狠狠撸狠狠干 | 国产又粗又黄又爽又硬的视频 | 精品人妻伦一区二区三区久久 | 三浦理惠子av在线播放 | 国产激情一区二区三区 | 深夜福利国产精品 | a天堂在线 | 少妇人妻丰满做爰xxx | 人妻av一区二区 | 人妻无码一区二区三区 | www.桃色 | 国产91高清| 一区二区三区影院 | 美乳人妻一区二区三区 | 亚洲三级久久 | 欧美亚洲一区二区在线观看 | 久久久综合| 国产伦理久久精品久久久久 | 国产免费一区二区三区四区五区 | 激情免费视频 | 精品无码国产污污污免费网站 | 李丽珍裸体午夜理伦片 | 日本少妇色视频 | 三级在线观看 | 亚洲欧美日韩精品 | 波多野吉衣伦理片 | 国产色自拍 | 波多野结衣不卡视频 | 精品少妇人妻av一区二区 | 91大神小宝寻花在线观看 | 欧美丰满熟妇xxxxx | 韩国三级在线视频 | 国产日韩在线观看一区 | 欧美福利一区二区 | 黄色一机片| 动漫美女露胸网站 | 黄色一级片免费观看 | 欧美中文字幕在线视频 | 无码人妻一区二区三区免费n鬼沢 | 国产午夜精品在线 | av官网在线 | 国产porn| 欧美极品在线视频 | 在线波多野结衣 | 午夜视频在线观看一区二区 | 日日噜噜噜噜久久久精品毛片 | 91亚洲国产成人精品一区二区三 | 午夜国产福利在线 | 一区二区三区在线电影 | 床戏高潮做进去大尺度视频网站 | 黄色aaa视频 | 黄色a∨| 日本免费福利视频 | 91亚洲精| 操你啦影院 | 在线观看国产 | 亚洲天堂av免费在线观看 | 火影黄动漫免费网站 | 亚洲v天堂 | 加勒比在线一区 | 国产一区二区三区视频免费观看 | 日韩精品一区不卡 | 国产拍拍视频 | 好男人www社区 | 超碰资源在线 | 国产三级网站 | 成人自拍av | 亚洲第一国产 | 无码人妻一区二区三区一 | 人人射视频 | 精品国产乱码久久久久久蜜臀网站 | 青青操视频在线 | 欧美体内谢she精2性欧美 | 99看片 | 久久久一区二区 | 波多野结衣1区2区3区 | 中文字幕无产乱码 | 樱桃香蕉视频 | av大帝在线| 91另类| 色综合天天综合 | 痴汉电车在线播放 | 三上悠亚中文字幕在线播放 | 丝袜一级片 | 中文字幕成人在线观看 | 精品无码久久久久成人漫画 | 日本a级c片免费看三区 | 国产精品美女久久久久图片 | 午夜有码 |