Aber inet_ntoa() nimmt kein u_int32_t-Argument, sondern ein struct in_addr-Argument, daher die vorherige Antwort: p (char *)inet_ntoa(3) scheint mir falsch zu sein.
Hier ist eine Möglichkeit, eine Funktion in einer Datei namens gdb.cmd.txt zu definieren, so dass beim Start "gdb -x gdb.cmd.txt" aufgerufen wird.
Geben Sie in der gdb.cmd.txt Folgendes ein:
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
Führen Sie dann gdb aus und rufen Sie die ntoa "user defined function" wie folgt auf:
(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
BTW: Ich suche jetzt, ob es in gdb eine Möglichkeit gibt, eine Funktion einen formatierten String zurückgeben zu lassen, so dass ich den Befehl "p ntoa(0x01020304)" oder "p ntoa(ptr->ipv4_addresss)" ausführen kann (vorausgesetzt, ptr ist ein gültiger ptr zu einer Struktur, die ein u_int32_t ipv4_address" Datenelement enthält). Aber es scheint, dass die benutzerdefinierten Funktionen von gdb keine sprintf()-Aufrufe erlauben.
-dennis bednar Dez. 2012