GDBでC文字列の全長を印刷したい。デフォルトでは省略されていますが、GDBに文字列全体を表示させるにはどうすればよいですか?
set print elements 0
set print elements
number-of-elements
配列GDBの要素数を制限します。 GDBが大きな配列を印刷している場合は、set print elements
コマンドで設定された数の要素を印刷した後で印刷を停止します。この制限は文字列の表示にも適用されます。 GDBが起動すると、この制限は200に設定されます。 設定 要素数 ゼロにすると、印刷は無制限になります。。
プログラムが正常な状態にある限り、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
警告: