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


376

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

回答:


504
set print elements 0

GDBマニュアルから

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

4
最近では、 "set print repeats 0"も必要になる場合があります。そうでない場合、GDBは文字列/配列の繰り返される要素を省略します。
ジョンリンドグレン2018

これは配列型にも適用されます
Trevor Boyd Smith

1
「最大値のサイズを無制限に設定」する必要がある場合もあります。
AMS

100

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


2
この回答は、エスケープするのではなく改行/復帰改行文字を尊重するので、「私の印刷要素を0に設定する」よりも優れています。
mhenry1384

6
良い解決策ですが、コアダンプファイルを分析しようとすると機能しません
Elalfer、2011年

華麗な提案duskwuff、私はそれをコピーしてprintf呼び出しに貼り付けてエスケープされていない出力を取得する前にそれを読んだことを願っています。:D
nevelis

4
注:このオプションは、ライブプログラムをデバッグする場合にのみ機能します。コアファイルをデバッグしているときは、GDBの「call」コマンドを使用できません。
ソロモンスロー

1
また、gdbは正常である必要がありますが、これはだんだんそうではないように思われます(私のMac OS Xマシンで「現在のコンテキストでは「シンボル "プット"なし」と表示されます)
Michael

39

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

(gdb)x / 300sb stmt.c_str()
0x9cd948: "SELECT article.r" ...
0x9cd958:「articlからのowid」...
..

3
「x / 300sb」が何を意味するのかと思っていました。このチートシート(pdf)を使用して、「x / 300sb cstr」を「アドレスcstrのメモリのeXamine 300ユニット(バイト)、NULLで終了する文字列(S)として解釈される」と翻訳しました。文字列の長さが100の場合、意味のあるものかどうかに関係なく、300バイトすべてが出力されるため、大量のゴミが表示されます。それでも+1を紹介してくれてx
Rob W

39

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

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

2
申し訳ありませんが、これは真実ではありません
UmNyobe '29年

11
これはset print elements nnn制限を尊重しているようであり、そうしない限り完全な文字列は印刷されませんset print elements 0
マークラカタ2017年

3
これを試してみると、「値を整数に変換することはできません。」としか得られません。
フィリップルートヴィヒ

2
std :: stringの場合、「値は整数に変換できません」エラーを回避するためにstring.c_str()が必要です
Paul Childs

21

ちょうどそれを完了するために:

(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}

これは、それらの値でデバッグする場合に役立ちます。


1

使用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

警告:

  • 1つ目はstd :: stringのメンバーにアクセスするため、c ++ lib依存ですが、簡単に調整できます。
  • 2つ目は、strlenを呼び出す実行中のプログラムでのみ使用できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.