検索
ホームページシステムチュートリアルLinuxLinux デバッガーに関する高度なトピックの詳細

Linux デバッガーに関する高度なトピックの詳細

Jan 08, 2024 pm 10:42 PM
linuxLinuxチュートリアルレッドハットLinuxシステムLinuxコマンドLinux 認定レッドハットリナックスLinuxビデオ

###導入### ついにこのシリーズも最後の記事になりました!今回は、デバッグにおけるより高度な概念 (リモート デバッグ、共有ライブラリのサポート、式の評価、およびマルチスレッドのサポート) の概要を説明します。これらのアイデアは実装がより複雑なので、その方法については詳しく説明しませんが、これらのコンセプトについてご質問があれば喜んでお答えします。 シリーズインデックス
  1. 環境の準備
  2. ブレークポイント
  3. レジスタとメモリ
  4. エルフとドワーフ
  5. ソースコードとシグナル
  6. ソースコード層は段階的に実行されます
  7. ソースコード層ブレークポイント
  8. コールスタック
  9. 変数の処理
  10. 高度なテーマ
リモートデバッグ

リモート デバッグは、組み込みシステムやさまざまな環境のデバッグに非常に役立ちます。また、高レベルのデバッガ操作と、オペレーティング システムおよびハードウェアとの対話との間に紙一重の境界線を設定します。実際、GDB や LLDB などのデバッガは、ローカル プログラムをデバッグする場合でもリモート デバッガとして実行できます。一般的なアーキテクチャは次のとおりです:
Linux 调试器之高级主题!

デブアーカイブ

デバッガーは、コマンド ラインを通じて対話するコンポーネントです。おそらく IDE を使用している場合は、その上にマシン インターフェイスを介してデバッガーと通信する別のレイヤーがあるでしょう。ターゲット マシン (おそらくネイティブ マシンと同じ) にはデバッグ スタブがあります。これは理論的には、アドレスにブレークポイントを設定するなどのすべての低レベルのデバッグ タスクを実行する、非常に小さなオペレーティング システム デバッグ ライブラリのラッパーです。 「理論上」と言ったのは、最近デバッグ スタブがますます大きくなっているためです。たとえば、私のマシンの LLDB デバッグ スタブのサイズは 7.6MB です。デバッグ スタブは、オペレーティング システム固有の機能 (この場合は ptrace) を使用して、リモート プロトコル経由でデバッグ対象のプロセスおよびデバッガーと通信します。
最も一般的なリモート デバッグ プロトコルは、GDB リモート プロトコルです。これは、デバッガとデバッグ スタブの間でコマンドと情報を渡すために使用されるテキストベースのパケット形式です。詳細については説明しませんが、ここでさらに詳しく読むことができます。 LLDB を起動し、コマンド log enable gdb-remote packets を実行すると、リモート プロトコル経由で送信されたすべてのパケットのトレースが取得されます。 GDB では、setremotelogfile を使用して同じことを行うことができます。

簡単な例として、これはブレークポイントを設定するパケットです:

リーリー

$ パケットの先頭をマークします。 Z0 はメモリ ブレークポイントを挿入するコマンドです。 400570 と 1 はパラメータで、前者はブレークポイントを設定するアドレス、後者は特定のターゲットのブレークポイント タイプ指定子です。最後に、#43 はデータが破損していないことを確認するためのチェックサムです。

GDB リモート プロトコルは、カスタム パケットを使用して拡張するのが非常に簡単で、プラットフォームまたは言語固有の機能を実装するのに役立ちます。

共有ライブラリと動的読み込みのサポート

デバッガは、ブレークポイントを設定したり、ソース コード レベルの情報やシンボルを取得したりできるように、デバッグ中のプログラムによってどの共有ライブラリがロードされているかを知る必要があります。デバッガーは、動的にリンクされているライブラリを検索するだけでなく、実行時に dlopen を介してロードされるライブラリもトレースする必要があります。この目的を達成するために、ダイナミック リンカーは交差構造を維持します。この構造は、共有ライブラリ記述子のリンク リストと、リンク リストが更新されるたびに呼び出される関数へのポインタを維持します。この構造体は ELF ファイルの .dynamic セクションに保存され、プログラムの実行前に初期化されます。

シンプルな追跡アルゴリズム:

  • トレーサは、ELF ヘッダー内のプログラムのエントリを検索します (または、/proc//aux に保存されている補助ベクトルを使用することもできます)。
  • 追跡プログラムは、プログラムの入り口にブレークポイントを設定し、実行を開始します。
  • ブレークポイントに到達すると、ELF ファイル内の .dynamic のロード アドレスを検索することで交差構造のアドレスが見つかります。
  • 現在ロードされているライブラリのリストについては、交差構造を確認してください。
  • リンカ更新関数にブレークポイントを設定します。
  • リストはブレークポイントに到達するたびに更新されます。
  • 追跡プログラムは無限ループし、プログラムの実行を継続し、追跡プログラム信号が終了するまで信号を待ちます。

これらの概念の小さな例を書きました。ここにあります。興味のある方がいらっしゃいましたら、今後詳しく書きます。

式の計算

式の評価は、ユーザーがプログラムのデバッグ中に元のソース言語で式を評価できるようにするプログラムの機能です。たとえば、LLDB または GDB では、print foo() を実行して foo 関数を呼び出し、結果を出力できます。

式の複雑さに応じて、いくつかの異なる計算方法があります。式が単なる単純な識別子の場合、このシリーズの最後の部分で行ったのと同じように、デバッガーはデバッグ情報を調べ、変数を見つけて値を出力できます。式がある程度複雑な場合は、コードを中間式 (IR) にコンパイルし、それを解釈して結果を取得できる場合があります。たとえば、一部の式の場合、LLDB は Clang を使用して式を LLVM IR にコンパイルし、解釈します。式がより複雑な場合、または特定の関数の呼び出しが必要な場合は、コードをターゲットに JIT してデバッグ対象のアドレス空間で実行する必要がある場合があります。これには、mmap を呼び出して実行可能メモリを割り当て、コンパイルされたコードをそのブロックにコピーして実行することが含まれます。 LLDB は、LLVM の JIT 機能を使用して実装されます。

JIT コンパイルについてさらに詳しく知りたい場合は、このテーマに関する Eli Bendersky の記事を強くお勧めします。

多线程调试支持

本系列展示的调试器仅支持单线程应用程序,但是为了调试大多数真实程序,多线程支持是非常需要的。支持这一点的最简单的方法是跟踪线程的创建,并解析 procfs 以获取所需的信息。

Linux 线程库称为 pthreads。当调用 pthread_create 时,库会使用 clone 系统调用来创建一个新的线程,我们可以用 ptrace 跟踪这个系统调用(假设你的内核早于 2.5.46)。为此,你需要在连接到调试器之后设置一些 ptrace 选项:

ptrace(PTRACE_SETOPTIONS, m_pid, nullptr, PTRACE_O_TRACECLONE);

现在当 clone 被调用时,该进程将收到我们的老朋友 SIGTRAP 信号。对于本系列中的调试器,你可以将一个例子添加到 handle_sigtrap 来处理新线程的创建:

case (SIGTRAP | (PTRACE_EVENT_CLONE 
<p>一旦收到了,你可以看看 /proc//task/ 并查看内存映射之类来获得所需的所有信息。</p>
<p>GDB 使用 libthread_db,它提供了一堆帮助函数,这样你就不需要自己解析和处理。设置这个库很奇怪,我不会在这展示它如何工作,但如果你想使用它,你可以去阅读这个教程。</p>
<p>多线程支持中最复杂的部分是调试器中线程状态的建模,特别是如果你希望支持不间断模式或当你计算中涉及不止一个 CPU 的某种异构调试。</p>
<strong>最后!</strong>
<p>呼!这个系列花了很长时间才写完,但是我在这个过程中学到了很多东西,我希望它是有帮助的。如果你有关于调试或本系列中的任何问题,请在 Twitter @TartanLlama或评论区联系我。如果你有想看到的其他任何调试主题,让我知道我或许会再发其他的文章。</p>

以上がLinux デバッガーに関する高度なトピックの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はLinux就该这么学で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
デスクトップコンピューティングとゲームにWindowsが一般的に使用されるのはなぜですか?デスクトップコンピューティングとゲームにWindowsが一般的に使用されるのはなぜですか?Apr 27, 2025 am 12:01 AM

windowsispreferred fordeskcomputing andgamingdueto:1)itsvastsoftwareandgamelibrary、2)user-frendlyandcustomizable interface、3)広範なハードワレコンパート性、4)パフォーマンス最適化のキャピリティ、デスパイト測定 - 硬化型系標識。

Linuxソフトウェアの未来:FlatpakとSnapはネイティブデスクトップアプリを置き換えますか?Linuxソフトウェアの未来:FlatpakとSnapはネイティブデスクトップアプリを置き換えますか?Apr 25, 2025 am 09:10 AM

Linuxソフトウェア分布は、各分布のエコシステムに深く染み込んでおり、DEBやRPMなどのネイティブ形式に依存していました。 ただし、フラットパックとスナップが出現し、アプリケーションパッケージへの普遍的なアプローチが約束されています。 この記事試験

LinuxとWindowsがデバイスドライバーを処理する方法の違いは何ですか?LinuxとWindowsがデバイスドライバーを処理する方法の違いは何ですか?Apr 25, 2025 am 12:13 AM

デバイスドライバーの取り扱いにおけるLinuxとWindowsの違いは、主にドライバー管理と開発環境の柔軟性に反映されています。 1。Linuxはモジュラー設計を採用し、ドライバーを動的にロードしてアンインストールできます。開発者は、カーネルメカニズムを深く理解する必要があります。 2。WindowsはMicrosoftエコシステムに依存しており、ドライバーはWDKを通じて開発して署名および認定される必要があります。開発は比較的複雑ですが、システムの安定性とセキュリティを保証します。

LinuxとWindowsのセキュリティモデルを比較対照します。LinuxとWindowsのセキュリティモデルを比較対照します。Apr 24, 2025 am 12:03 AM

LinuxとWindowsのセキュリティモデルには、それぞれ独自の利点があります。 Linuxは、柔軟性とカスタマイズ可能性を提供し、ユーザーの権限、ファイルシステム許可、Selinux/Apparmorを通じてセキュリティを可能にします。 Windowsはユーザーフレンドリーに焦点を当てており、WindowsDefender、UAC、Firewall、BitLockerに依存してセキュリティを確保しています。

ハードウェアの互換性は、LinuxとWindowsの間でどのように異なりますか?ハードウェアの互換性は、LinuxとWindowsの間でどのように異なりますか?Apr 23, 2025 am 12:15 AM

LinuxとWindowsはハードウェアの互換性が異なります。Windowsには広範なドライバーサポートがあり、Linuxはコミュニティとベンダーに依存します。 Linux互換性の問題を解決するために、RTL818888EUドライバーリポジトリのクローニング、コンパイル、インストールなど、ドライバーを手動でコンパイルできます。 Windowsユーザーは、パフォーマンスを最適化するためにドライバーを管理する必要があります。

LinuxとWindowsの間の仮想化サポートの違いは何ですか?LinuxとWindowsの間の仮想化サポートの違いは何ですか?Apr 22, 2025 pm 06:09 PM

仮想化サポートのLinuxとWindowsの主な違いは次のとおりです。1)LinuxはKVMとXenを提供し、優れたパフォーマンスと柔軟性を備えており、高いカスタマイズ環境に適しています。 2)Windowsは、友好的なインターフェイスを備えたHyper-Vを介した仮想化をサポートし、Microsoftソフトウェアに依存する企業に適したMicrosoft Ecosystemと密接に統合されています。

Linuxシステム管理者の主なタスクは何ですか?Linuxシステム管理者の主なタスクは何ですか?Apr 19, 2025 am 12:23 AM

Linuxシステム管理者の主なタスクには、システムの監視とパフォーマンスチューニング、ユーザー管理、ソフトウェアパッケージ管理、セキュリティ管理とバックアップ、トラブルシューティングと解像度、パフォーマンスの最適化、ベストプラクティスが含まれます。 1. TOP、HTOP、その他のツールを使用して、システムのパフォーマンスを監視し、チューニングします。 2。ユーザーADDコマンドおよびその他のコマンドを介して、ユーザーアカウントとアクセス許可を管理します。 3. APTとYUMを使用してソフトウェアパッケージを管理し、システムの更新とセキュリティを確保します。 4.ファイアウォールを構成し、ログを監視し、データバックアップを実行して、システムセキュリティを確保します。 5.ログ分析とツールの使用を通じてトラブルシューティングと解決。 6.カーネルパラメーターとアプリケーションの構成を最適化し、ベストプラクティスに従ってシステムのパフォーマンスと安定性を向上させます。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。