How do I print the full value of a long string in gdb?
Asked Answered
H

6

457

I want to print the full length of a C-string in GDB. By default it's being abbreviated, how do I force GDB to print the whole string?

Hooked answered 24/10, 2008 at 12:36 Comment(0)
H
616
set print elements 0

From the GDB manual:

set print elements number-of-elements
Set a limit on how many elements of an array GDB will print. If GDB is printing a large array, it stops printing after it has printed the number of elements set by the set print elements command. This limit also applies to the display of strings. When GDB starts, this limit is set to 200. Setting number-of-elements to zero means that the printing is unlimited.
Hooked answered 24/10, 2008 at 12:37 Comment(3)
Nowadays you might also need "set print repeats 0", otherwise GDB will omit repeated elements of the string/array.Bendicta
this also applies to array types tooArterial
You may also need to "set max-value-size unlimited".Scholasticate
A
117

As long as your program's in a sane state, you can also call (void)puts(your_string) to print it to stdout. Same principle applies to all functions available to the debugger, actually.

Argil answered 31/10, 2008 at 10:42 Comment(6)
This answer is even better than "set print elements 0" (for my purposes) because it respects the newline/carriage return chars instead of escaping them.Curassow
Good solution, but doesn't work when trying to analyze core dump fileThiazine
Note: this option only works if you are debugging a live program. You can't use GDB's "call" command when you are debugging a core file.Sapanwood
also requires gdb to be sane, which increasingly seems to NOT be the case (I get "No symbol "puts" in current context." on my Mac OS X machine)Presentable
I simply wrtie "puts(your_string)" in the output window of xcodeLeviathan
Also doesn't work when you debugging a program which doesn't have puts() and problematic when puts() uses a UART and the UART of your target requires a running CPU.Declass
C
59

The printf command will print the complete strings:

(gdb) printf "%s\n", string
Craigie answered 3/12, 2015 at 20:47 Comment(5)
sorry but this is not trueFighterbomber
This seems to respect the set print elements nnn limit, and will not print the complete string unless you do set print elements 0.Superabundant
When I try this I only get: "Value can't be converted to integer."Superable
for std::string you need string.c_str() in order to avoid the "Value can't be converted to integer" errorPseudonym
Doesn't work if you are debugging a core dump.Shied
S
44

There is a third option: the x command, which allows you to set a different limit for the specific command instead of changing a global setting. To print the first 300 characters of a string you can use x/300s your_string. The output might be a bit harder to read. For example printing a SQL query results in:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..
Sewing answered 6/10, 2011 at 16:15 Comment(1)
I was wondering what "x/300sb" meant. With the help of this cheat sheet (pdf), I've translated "x/300sb cstr" as "eXamine 300 units (Bytes) of memory at address cstr, interpreted as a NULL-terminated string (S).". If your string has length 100, then you will see lots of garbage, because all 300 bytes are printed, whether they make sense or not. +1 nevertheless for introducing me to x!Bobker
R
23

Just to complete it:

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

You must give a length, but may change the representation of that string:

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

This may be useful if you want to debug by their values

Radiocarbon answered 18/1, 2012 at 11:5 Comment(0)
P
2

Using set elements ... isn't always the best way. It would be useful if there were a distinct set string-elements ....

So, I use these functions in my .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

Caveats:

  • The first is c++ lib dependent as it accesses members of std::string, but is easily adjusted.
  • The second can only be used on a running program as it calls strlen.
Psychotherapy answered 23/6, 2016 at 7:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.