Но inet_ntoa () не принимает аргумент u_int32_t, а скорее аргумент struct in_addr, поэтому предыдущий ответ:
p (char *) inet_ntoa (3)
мне кажется неправильным.
Вот способ определения функции в файле с именем gdb.cmd.txt, поэтому при запуске вызывайте «gdb -x gdb.cmd.txt».
В файле gdb.cmd.txt введите это:
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
Затем запустите gdb и вызовите ntoa «пользовательскую функцию» следующим образом:
</p>
<pre><code>(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
Кстати: я сейчас ищу, есть ли способ в gdb, чтобы функция возвращала форматированную строку, чтобы я мог запустить команду "p ntoa (0x01020304)" или "p ntoa (ptr-> ipv4_addresss)" ( при условии, что ptr является допустимым ptr для структуры, содержащей элемент данных u_int32_t ipv4_address "). Но, похоже, что пользовательские функции GDB не допускают вызовы sprintf ().
-денис беднар декабрь 2012