gdbで長い文字列の完全な値を印刷するにはどうすればよいですか?
質問
GDBでC文字列の完全な長さを印刷したい。デフォルトでは省略されていますが、GDBに文字列全体を出力させるにはどうすればよいですか?
解決
set print elements 0
印刷要素の設定
要素の数
配列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を呼び出すため、実行中のプログラムでのみ使用できます。
所属していません StackOverflow