Printing IPs using gdb

I am debugging network code and want to print IP addresses declared as int32 . when I print it with the gdb print command, I get some values ​​that don't matter much.

How can I print them in a meaningful format?

+4
source share
6 answers

Just use inet_ntoa(3) like this:

 (gdb) p (char*)inet_ntoa(0x01234567) # Replace with your IP address $1 = 0xa000b660 "103.69.35.1" 
+8
source

If you are debugging the main file and cannot use inet_ntoa (), you can also do something like:

  (gdb) set $ int_ip = 0x01234567
 (gdb) printf "% d.% d.% d.% d \ n", ($ int_ip & 0xff), ($ int_ip >> 8) & 0xff, ($ int_ip >> 16) & 0xff, ($ int_ip >> 24)
 103.69.35.1
 (gdb) 
+5
source

But inet_ntoa () does not accept the u_int32_t argument, but rather the struct in_addr argument, so the previous answer: p (char *) inet_ntoa (3) seems wrong to me.

Here is a way to define a function in a file called gdb.cmd.txt, so "gdb -x gdb.cmd.txt" is called at startup.

In gdb.cmd.txt put this:

 define ntoa set $ipv4 = $arg0 echo IPV4 =. p $ipv4 set $val1 = ($ipv4 >> 24) & 0xff set $val2 = ($ipv4 >> 16) & 0xff set $val3 = ($ipv4 >> 8) & 0xff set $val4 = ($ipv4 >> 0) & 0xff printf "IPV4=%u=0x%02x.%02x.%02x.%02x =%d.%d.%d.%d\n", $ipv4, $val1, $val2, $val3, $val4, $val1, $val2, $val3, $val4 end 

Then run gdb and call ntoa "user function" as follows:

 (gdb) ntoa(0x01020304) IPV4 =.$10 = 16909060 IPV4=16909060=0x01.02.03.04 =1.2.3.4 (gdb) ntoa(-1) IPV4 =.$10 = -1 IPV4=4294967295=0xff.ff.ff.ff =255.255.255.255 

code>

BTW: now I'm looking for a way in gdb that the function returns a formatted string so that I can run the command "p ntoa (0x01020304)" or "p ntoa (ptr-> ipv4_addresss)" (assuming ptr is a valid ptr for structure containing the u_int32_t ipv4_address data item). But it turns out that user-defined gdb functions do not allow sprintf () calls.

-dennis bednar Dec 2012

+3
source

Create a function that calls inet_ntoa, and then call it with the p command in gdb on int.

+1
source

Here is another interesting way:

 #include <sys/types.h> // u_int32_t // next 3 for inet_ntoa() call #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> // C++ headers #include <iostream> // std::cout #include <string> #include <sstream> // ostringstream // class to aid in using the gdb(3) debugger to print a u_int32_t ip_address as a string. // The toString() is a static method!! // How to call a C++ method from the gdb debugger, to simulate the inet_nto(3) method // // From within gdb debugger, you must have a process, so first stop at main: // b main // r // // (gdb) p MYIP4::toString(0x0fffefdfc) // $1 = "255.254.253.252" // // (gdb) p MYIP4::toString(-1) // $2 = "255.255.255.255" // // (gdb) p MYIP4::toString(65536) // $3 = "0.1.0.0" // // Drawbacks: the a.out executable that you are debugging needs the MYIP4 class already // compiled and linked into the executable that you are debugging. // // PS: I don't know if there is a "slick way" where the MyIP4 class could dynamically be loaded, // within gdb(), if the executable failed to contain the MYIP4 class. // // PS: I had trouble with my operator() idea.. If you know how to improve on it, post away! // // @author 1201207 dpb created //============================= class MYIP4 { public: static std::string toString(u_int32_t ipv4_address ) { struct in_addr temp_addr; // inet_ntoa() returns a char * to a buffer which may be overwritten // soon, so convert char* to a string for extra safety. temp_addr.s_addr = htonl(ipv4_address); std::string ipv4String = std::string(inet_ntoa( temp_addr )); return ipv4String; } #if 0 // this idea did NOT work, so it is commented out. // // overload the () operator, so that, within gdb, we can simply type: // p MYIP4(0x01020304) // instead of: // p MYIP4::toString(0x01020304) std::string operator() ( u_int32_t ipv4_address ) { return toString(ipv4_address); } #endif }; void test1(); int main() { test1(); return 0; } void test1() { u_int32_t ipv4Address = 0x01020304; // host byte order for 1.2.3.4 std::cout << "Test1: IPAddress=" << MYIP4::toString(ipv4Address) << "\n"; } 

0
source

Try the following command:

 (gdb) p/uc (char[4])342757386 $1 = {10 '\n', 16 '\020', 110 'n', 20 '\024'} 
0
source

All Articles