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

后端 未结 6 838
栀梦
栀梦 2020-11-28 17:17

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?

相关标签:
6条回答
  • 2020-11-28 17:32
    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.
    0 讨论(0)
  • 2020-11-28 17:35

    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.

    0 讨论(0)
  • 2020-11-28 17:38

    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"...
    ..
    
    0 讨论(0)
  • 2020-11-28 17:47

    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.
    0 讨论(0)
  • 2020-11-28 17:54

    The printf command will print the complete strings:

    (gdb) printf "%s\n", string
    
    0 讨论(0)
  • 2020-11-28 17:57

    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

    0 讨论(0)
提交回复
热议问题