gdbで長い文字列の完全な値を印刷するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/233328

質問

GDBでC文字列の完全な長さを印刷したい。デフォルトでは省略されていますが、GDBに文字列全体を出力させるにはどうすればよいですか?

役に立ちましたか?

解決

set print elements 0

GDBマニュアルから

印刷要素の設定 要素の数
配列GDBの要素の数に制限を設定します。 GDBが大きな配列を印刷している場合、 set print elements コマンドで設定された要素数を印刷した後、GDBは印刷を停止します。この制限は、文字列の表示にも適用されます。 GDBが起動すると、この制限は200に設定されます。 number-of-elements をゼロに設定すると、印刷が無制限になります

他のヒント

プログラムが正常な状態にある限り、 call(void)puts(your_string)を使用して標準出力に出力することもできます。実際には、同じ原則がデバッガーで使用可能なすべての機能に適用されます。

3番目のオプションがあります:xコマンド。グローバル設定を変更する代わりに、特定のコマンドに異なる制限を設定できます。文字列の最初の300文字を印刷するには、 x / 300s your_string を使用できます。出力は少し読みにくいかもしれません。たとえば、SQLクエリの出力結果は次のとおりです。

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

printf コマンドは、完全な文字列を出力します:

(gdb) printf "%s\n", string

完了します:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

長さを指定する必要がありますが、その文字列の表現を変更できます:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

これは、値でデバッグする場合に便利です

set elements ... を使用することが常に最良の方法とは限りません。個別の set string-elements ... がある場合に役立ちます。

したがって、.gdbinitでこれらの関数を使用します:

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

警告:

  • 最初は、std :: stringのメンバーにアクセスするため、c ++ lib依存ですが、簡単に調整できます。
  • 2番目はstrlenを呼び出すため、実行中のプログラムでのみ使用できます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top