ホームページ バックエンド開発 PHPチュートリアル Gdb メソッドによる EG (symbol_table) ハッシュ テーブル key_PHP のチュートリアル

Gdb メソッドによる EG (symbol_table) ハッシュ テーブル key_PHP のチュートリアル

Jul 13, 2016 pm 05:47 PM
gdb key table ハッシュ 記事 方法 表面 トラバース

Sara Golemon は、「GLOBALS 配列を見つけることができる特別な場所はありますか?」と述べた記事を書きました。答えは「存在する」です。これは EG (symbol_table)-Executor Globals 構造体です。また、具体的な例も示しました。どこで見つけられますか?

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, "未定義の変数: %s", varname);

RETURN_NULL();

}

*return_value = **varvalue;

zval_copy_ctor(return_value);

}

soにコンパイルしてロードしたら、phpのテストコードを書きます

$abc = '文字列';

$def = 'string2';

var_dump(confirm_getGlobal_compiled('abc'));

実行結果

string(6) "文字列"

なぜ余分な def 変数が書かれているのか不思議に思うかもしれません。次に EG ハッシュテーブルを見てみましょう。

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

デバッグコードは以下の通りです

(gdb) b renzhi.c: 301 //書き込みの延長にブレークポイントを追加

renzhi.c.という名前のソースファイルはありません

今後の共有ライブラリのロード時にブレークポイントを保留します (y または [n]) y

ブレークポイント 1 (renzhi.c : 301) 保留中です。

(gdb) r //ブレークポイントまで実行

起動プログラム: /root/php-src-5.3/bin/php -c php.ini ceshi.php

警告: "/lib/libc.so.6" の .dynamic セクションが予期されたアドレスにありません

警告: 違いはプレリンク、期待値の調整によって生じているようです

[libthread_db を使用したスレッドのデバッグが有効]

ブレークポイント 1、zif_confirm_getGlobal_compiled (ht=1、return_value=0x837a43c、return_value_ptr=0x0、this_ptr=0x0、return_value_used=1)

/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)ん

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

(gdb) step //zend_hash_findハッシュ検索関数を入力

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

以下のキーをチェックしてください

(gdb) p *ht

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

pListTail = 0x837a3fc、arBuckets = 0x83705a8、pDestructor = 0x81923b0 <_zval_ptr_dtor>、永続 = 0 '

bApplyProtection = 1 '

(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"}

 

有点乱,这里第一条就是现实了EGこのハッシュ表里面有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 = '文字列';

$def = 'string2';

 

この 2 つの量名の特定のハッシュのバケット了

 

(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'

(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 方式で指针完了を確認し、実行された zval の内容を確認しますか?

 

既知のバケット構造体内の pData がコンテンツを実行します

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

$19 = (無効 *) 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 = {値 = {lval = 138024112, dval = 1.2800167717828578e-313, str = {val = 0x83a14b0 "文字列", len = 6}, ht = 0x83a14b0, obj = {ハンドル = 138024112,

      ハンドラー = 0x6}}、refcount__gc = 1、タイプ = 6 ' 06'、is_ref__gc = 0 ' 00'}

 

哈哈、特定のハッシュ指向の値が確認できます

 

しかしまたある点不明白了pDataとpDataPtrは底有関係ですか?

 

(gdb) p &$29->pDataPtr

$46 = (ボイド **) 0x839fe28

(gdb) p $29->pData

$47 = (無効 *) 0x839fe28

つまり、pDataPtrのアドレスがpData

に格納されます

xiaoq3406さんのコラムより抜粋

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478497.html技術記事 Sara Golemon は次のような記事を書きました: GLOBALS 配列を見つけるための特別な場所はありますか?答えは存在です、それは EG (symbol_table)-Executor Globals 構造です、と彼女はまた言いました...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GIGABYTE マザーボードでキーボード ブート機能を設定する方法 (GIGABYTE マザーボードでキーボード ブート モードを有効にする) GIGABYTE マザーボードでキーボード ブート機能を設定する方法 (GIGABYTE マザーボードでキーボード ブート モードを有効にする) Dec 31, 2023 pm 05:15 PM

Gigabyte のマザーボードでキーボード起動を設定する方法 まず、キーボード起動をサポートする必要がある場合は、PS2 キーボードである必要があります。 !設定手順は次のとおりです: ステップ 1: 起動後に Del または F2 を押して BIOS に入り、BIOS の Advanced (Advanced) モードに移動します 通常のマザーボードは、デフォルトでマザーボードの EZ (Easy) モードに入ります。 F7 を押してアドバンスト モードに切り替える必要があります。ROG シリーズ マザーボードはデフォルトで BIOS に入ります。アドバンスト モード (説明には簡体字中国語を使用します) ステップ 2: - [アドバンスト] - [アドバンスト パワー マネージメント (APM)] を選択します。 ステップ 3 : オプション [PS2 キーボードによるウェイクアップ] を見つけます ステップ 4: このオプション デフォルトは無効です プルダウンすると、3 つの異なる設定オプションが表示されます: [スペースバー] を押してコンピューターの電源をオンにし、グループを押します

今すぐ Toutiao の記事を公開してお金を稼ぐにはどうすればよいですか?今すぐ Toutiao で記事を公開して収入を増やす方法! 今すぐ Toutiao の記事を公開してお金を稼ぐにはどうすればよいですか?今すぐ Toutiao で記事を公開して収入を増やす方法! Mar 15, 2024 pm 04:13 PM

1. 今すぐ Toutiao の記事を公開してどうやってお金を稼ぐことができますか?今すぐ Toutiao で記事を公開して収入を増やす方法! 1. 基本的な権利と利益の有効化: オリジナルの記事は広告によって利益を得ることができますが、利益を得るにはビデオが横画面モードでオリジナルである必要があります。 2. ファン100人の権利を有効化:ファン数が100人以上に達すると、マイクロヘッドライン、オリジナルQ&amp;A作成、Q&amp;Aから利益を得ることができます。 3. オリジナル作品にこだわる: オリジナル作品には記事、小見出し、質問などが含まれ、300 ワード以上であることが求められます。違法に盗用された作品をオリジナル作品として出版した場合、クレジットポイントが減点され、利益も差し引かれますのでご注意ください。 4. 垂直性:専門分野の記事を書く場合、分野を超えて自由に記事を書くことができず、適切な推薦が得られず、専門性や洗練度が得られず、ファンもつきにくいそして読者たち。 5. 活動: 高活動、

CS プレーヤーの第一選択: 推奨されるコンピューター構成 CS プレーヤーの第一選択: 推奨されるコンピューター構成 Jan 02, 2024 pm 04:26 PM

1. プロセッサ コンピュータ構成を選択する場合、プロセッサは最も重要なコンポーネントの 1 つです。 CS などのゲームをプレイする場合、プロセッサーのパフォーマンスはゲームのスムーズさや応答速度に直接影響します。 Intel Core i5 または i7 シリーズ プロセッサを選択することをお勧めします。これらのプロセッサは、強力なマルチコア処理能力と高周波数を備え、CS の高い要件に簡単に対応できるためです。 2. グラフィックス カード グラフィックス カードは、ゲームのパフォーマンスを左右する重要な要素の 1 つです。 CSなどのシューティングゲームでは、グラフィックカードの性能がゲーム画面の鮮明さや滑らかさに直結します。優れたグラフィックス処理能力と高いフレームレート出力を備え、より優れたゲーム体験を提供できる NVIDIA GeForce GTX シリーズまたは AMD Radeon RX シリーズ グラフィックス カードを選択することをお勧めします。

SQL の ID 属性は何を意味しますか? SQL の ID 属性は何を意味しますか? Feb 19, 2024 am 11:24 AM

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

Glodon Software のコンピューター構成の推奨事項、Glodon Software のコンピューター構成要件 Glodon Software のコンピューター構成の推奨事項、Glodon Software のコンピューター構成要件 Jan 01, 2024 pm 12:52 PM

Glodon Software は建築情報化分野に注力するソフトウェア会社で、その製品は建築の設計、建設、運用のあらゆる側面で広く使用されています。 Glodon ソフトウェアは機能が複雑でデータ量が大きいため、高度なコンピュータ構成が必要です。この記事では、読者が適切なコンピューター構成プロセッサーを選択できるように、Glodon Software のコンピューター構成に関する推奨事項をさまざまな側面から詳しく説明します。Glodon Software は、アーキテクチャー設計、シミュレーション、その他の操作を実行するときに大量のデータの計算と処理を必要とします。プロセッサの方が高いです。 Intel i7 シリーズや AMD Ryzen シリーズなど、マルチコアの高周波数プロセッサを選択することをお勧めします。これらのプロセッサは強力なコンピューティング能力とマルチスレッド処理能力を備えており、Glodon ソフトウェアのニーズをより適切に満たすことができます。メモリ メモリがコンピューティングに影響を与えています

マザーボード上のデジタルオーディオ出力インターフェイス - SPDIF OUT マザーボード上のデジタルオーディオ出力インターフェイス - SPDIF OUT Jan 14, 2024 pm 04:42 PM

マザーボード上の SPDIFOUT 接続線の順序 最近、ワイヤの配線順序に関する問題に遭遇しました。ネットで調べたところ、1、2、4がアウト、+5V、グラウンドに相当するという情報もあれば、1、2、4がアウト、グラウンド、+5Vに相当するという情報もありました。最善の方法は、マザーボードのマニュアルを確認することです。マニュアルが見つからない場合は、マルチメーターを使用して測定できます。最初にアースを見つけてから、残りの配線の順序を決定します。マザーボードの VDG 配線の接続方法 マザーボードの VDG 配線を接続するときは、VGA ケーブルの一端をモニターの VGA インターフェイスに差し込み、もう一端をコンピューターのグラフィックス カードの VGA インターフェイスに差し込む必要があります。マザーボードの VGA ポートに差し込まないよう注意してください。接続すると、次のことが可能になります

パッチ不可能な Yubico 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、YubiHSM 2FA デバイスのセキュリティが侵害される パッチ不可能な Yubico 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、YubiHSM 2FA デバイスのセキュリティが侵害される Sep 04, 2024 pm 06:32 PM

パッチ不可能な Yubico の 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、および YubiHSM 2FA デバイスのセキュリティが破られています。 Feitian A22 JavaCard および Infineon SLB96xx シリーズ TPM を使用するその他のデバイスも脆弱です。すべて

C++ でハッシュ検索アルゴリズムを使用する方法 C++ でハッシュ検索アルゴリズムを使用する方法 Sep 19, 2023 pm 02:49 PM

C++ でのハッシュ検索アルゴリズムの使用方法 ハッシュ検索アルゴリズムは、効率的な検索および保存テクノロジです。ハッシュ関数を通じてキーワードを固定長のインデックスに変換し、このインデックスをデータ構造の検索で使用します。 C++ では、標準ライブラリのハッシュ コンテナーとハッシュ関数を使用して、ハッシュ検索アルゴリズムを実装できます。この記事では、C++ でハッシュ検索アルゴリズムを使用する方法を紹介し、具体的なコード例を示します。ヘッダー ファイルと名前空間の紹介 まず、C++ でハッシュ検索アルゴリズムを使用する前に、

See all articles