1. CPUの動作原理
2. Linux のメモリ割り当て
3.スタック
1). ローカル変数、関数パラメータ、および関数の戻り値が格納される場所
2). 各スレッドのスタック領域は連続しており、互いに独立しています
3). x /100a $esp を使用して、スタックメモリ内の元データ
3. 関数呼び出し処理
関数呼び出しプロセスがスタック内のデータを編成する方法
4. ヒープの 3 レベルのヒープ管理
さらに詳しく知りたい場合は、「glibc メモリ管理 ptmalloc ソース コード分析.pdf」と heapdump ソース コードを読んでください。
5. 情報収集
スレッド情報スタックスペース すべてのヒープグローバル変数とローカル変数 コアに格納されているすべての情報は上記の方法でマイニング可能
5.1 メモリ情報の表示
X /100x アドレス
5.2 コールスタック X /100a $esp を表示する
5.3 ローカル変数の表示
地元の人への情報
5.4 グローバル変数の表示
P グローバル変数名
5.5 クラスインスタンスの表示
情報シンボル * クラスインスタンスアドレス
P * (クラス名 *) クラスインスタンスアドレス
5.6 STLコンテナの表示
Plist pmap …
5.7 ヒープ メモリ割り当てを表示する:
ヒープダンプ –a
6. トラブルシューティングの例
トラブルシューティングのプロセスは、情報を分析し統合するプロセスであり、第2章で紹介したさまざまな手法を総合的に利用して情報を収集し、問題の根源を一歩ずつ掘り下げ、繭をはぎ取っていくプロセスです。常に試し、仮説を立て、検証する必要があります。これは一種の高度な頭脳作業であり、多くの忍耐と元のコードの構造への精通が必要であり、根深い問題を特定するには、デモンストレーションと検証を繰り返して数か月かかる場合もあります。
プログラムが時々クラッシュしますか? 次は何?
6.1 次のコア ファイルの手がかりを観察します。
1) コア サイズは約 200M であり、クラッシュの原因がメモリ リークではないことを示しています。
2) プロセス番号は 5030 であり、ログはプロセス番号に関連付けることができます。
3) エラー タイプ 11 セグメンテーション違反。説明はメモリアクセス例外です
6.2 環境の準備 gdb を使用してコアファイルを開く
1) dss7016_tools.tar.gz ツールキットをインストールして、gdb (7.6) ヒープダンプが適切に配置されていることを確認します。
2) gdb UMTS.exe ../UMTS_5030-1437863062-11.core -x .gdbinit を使用してコア ファイルを開き、stl コンテナが正しく解析できることを確認します。
3) infosharedlibraryを使用して、ライブラリが正しくロードされているかどうかを確認します
6.3 クラッシュの表面的な原因を確認する
1) CZString::CZString コンストラクターで bt がクラッシュする
2) 分解してクラッシュが発生した場所を確認します。
3) レジスタの値を確認するための info レジスタ
4) 表面的な理由では、Mov edx,[eax +0x4] eax の値が間違っていることが確認され、エラーが発生します。
6.4 Eax の値が最初の困難な最適化スタックを逆転させない理由
1) パラメータ __x の値が間違っています。なぜですか?
stl_map.h および stl_tree.hを参照してください。
2) __X の値を見つける
3) これで、このマップの値が間違っていることが確認できます。
4) マップ内の値が間違っているのはなぜですか? 超難関ポイントに対する日常的なプロセス チェックはありません。
5) 根本原因は、CLiveChannel クラスが解放され、内部のロックが操作されたため、スレッド 1 のマップ構造が破壊され、セグメンテーション フォールトが発生したことが判明しました。