LoginSignup
1
1

More than 3 years have passed since last update.

lldb-gdb-remote.txt

Last updated at Posted at 2019-06-07

lldb-gdb-remote.txt d45eaf9405c865cae0737a92d5ebce4e485106c3 の google 翻訳を手直しした物です。
まだ作業中


LLDBは、マルチスレッドおよびリモートデバッグをより良くサポートするために、新しいGDBサーバーパケットを追加しました。
どうしてでしょうか?
通常、デバッグ時は合致するGDBとGDBサーバーを起動します。合致しないと、すぐに何かしらの問題が起きます。LLDBはGDBリモートプロトコルを幅広く利用しており、もう少し動的に、問題発生前にリモートターゲットの特性を明らかにしたいと思いました。また、信頼性の高い通信であれば解消する、既存のGDBリモートプロトコルの性能問題もありました。追加したパケットのうち、一部パケットは性能向上に寄与し、一部パケットはリモートプロセスを起動を可能にし(OSがあれば)、一部パケットはスレッドに属するレジスタが何なのかを動的に確認できるようにします。GDB においても、事前にGDBとGDBサーバー双方でレジスタ情報(レジスタ数、レジスタ番号、レジスタ名、オフセット)を確認しています。どの種類のアーキテクチャ、OS、ベンダーをデバッグしているのか、またスレッドレジスタのコンテキストに関してはどのようにレイアウトされているのかを動的に判断できることが望まれます。以下は、標準のGDBリモートプロトコルパケットに追加した新パケットの詳細です。

QStartNoAckMode

  • 概要

    ACKとNACKの送信をスキップするために、no ACKモードを有効にします。

  • 実装の優先度

    高。通信路の信頼性が高いならば, GDBサーバーは実装すべき機能。この機能で、パケット通信のスループットが向上し、接続性能が向上します。

  • 補足

    通常、すべてのパケットの後にACK/NACKを送信しなければならないので、処理が少し遅くなります。高信頼性の通信路(ソケットなど)では、トラヒックを最小限に抑えるためにACKパケットを無効にする手法が使えます。下記の、GDBまたはLLDBの例は、このパケットを送信して、ACKを無効にできるか試みています。send packet:で始まるすべての行はGDB/LLDBのもので、read packet:で始まるすべての行はGDBサーバーのものです。

    send packet: $QStartNoAckMode#b0
    read packet: +
    read packet: $OK#9a
    send packet: +
    

A

launch args packet

  • 概要

    実引数を与えつつプログラムを起動する

  • 実装の優先度

    低。
    先に、デバッグ対象のプロセスに未接続のGDBサーバーとLLDB/GDBを接続した後に、デバッグ対象のプロセスをリモートターゲット上で起動したい場合にのみ必要です。

  • 補足

    リモートサーバーへの接続を開始し、後で実行可能ファイルへのパスと実行時に使用する引数を指定できる "set program arguments"パケットのサポートを追加しました。

    このためのGDBリモートドキュメントは、下記です。

    プログラム引数を設定する(予約済み)Aarglen、argnum、arg、...

    Aの後には、16進エンコードされた引数の長さ(バイト数)、引数整数、それに続けて16進バイトに変換されたASCII文字が続きます。

    send packet: $A98,0,2f566f6c756d65732f776f726b2f67636c6179746f6e2f446f63756d656e74732f7372632f6174746163682f612e6f7574#00
    read packet: $OK#00
    

    上記のパケットは、リモートホスト上でプロセスを起動できるリモートデバッグ機能がある場合に役立ちます。ベアボード(ベアメタル)デバッグには必要ありません。

"QEnvironment:NAME=VALUE"

  • 概要

    A パケットを使い起動される、新しい子プロセス用の環境変数を設定します。
    注意:キーと値の組はそのまま送信されるので、gdb-remoteプロトコルのメタ文字(#$など)は利用できません。印刷不能な文字またはメタ文字が文字列に含まれている場合は、QEnvironmentHexEncodedが使用可能であれば、それを代わりに使用してください。送信前に環境変数を評価したくない場合は、QEnvironmentよりもQEnvironmentHexEncodedパケットの使用をお勧めします、利用可能であれば。

  • 実装の優先度


    先に、デバッグ対象のプロセスに未接続のGDBサーバーとLLDB/GDBを接続した後に、デバッグ対象のプロセスをリモートターゲット上で起動したい場合にのみ必要です

  • 補足

    GDBとLLDBはどちらも環境変数の受け渡しをサポートしています。 $#00(未実装)で応答しても大丈夫ですか?

    send packet: $QEnvironment:ACK_COLOR_FILENAME=bold yellow#00
    read packet: $OK#00
    

    このパケットは、Aパケットを送信する前に1回以上送信できます。

.... 続きは後日

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1