Gdb メソッドによる EG (symbol_table) ハッシュ テーブル key_PHP のチュートリアル
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さんのコラムより抜粋

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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