web-dev-qa-db-ja.com

gdbで長い文字列の全値を表示するにはどうすればいいですか?

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

347
John Carter
set print elements 0

GDBマニュアルより

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

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

95
duskwuff

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

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

printfコマンドは完全な文字列を表示します。

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

それを完成させるためだけに:

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

あなたがそれらの値でデバッグしたいなら、これは役に立つかもしれません

17
abstraktor

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を呼び出すときにのみ使用できます。
1
mrtimdog