Как получить параметры функции из bind ()? - PullRequest
1 голос
/ 13 марта 2012

При использовании gdb я часто получаю хороший список параметров, передаваемых функциям.Однако с некоторыми функциями, такими как bind, я не получаю параметры:

(gdb) break bind
Breakpoint 1 at 0x404b40
(gdb) r
...
Breakpoint 1, bind () at ../sysdeps/unix/syscall-template.S:82
82      in ../sysdeps/unix/syscall-template.S
(gdb) bt
#0  bind () at ../sysdeps/unix/syscall-template.S:82
...

Как я могу получить параметры, переданные этим функциям?

1 Ответ

1 голос
/ 16 марта 2012

bind - это один из системных вызовов сокетов.В gdb есть специальный способ установки точек останова на системные вызовы - catch syscall <syscall name>.После такого вида точки останова вы можете наблюдать параметры syscall в регистрах в соответствии с соглашениями о вызовах ядра .Для x86_64 параметры передаются через регистры% rdi,% rsi,% rdx,% r10,% r8 и% r9.Для x86-32 - через регистры% ebx,% ecx,% edx,% esi,% edi,% ebp.

(gdb) catch syscall bind 
Catchpoint 3 (syscall 'bind' [49])
(gdb) r
Starting program: /usr/bin/nmap google.com

Starting Nmap 5.00 ( http://nmap.org ) at 2012-03-16 01:09 PDT
Warning: Hostname google.com resolves to 6 IPs. Using 173.194.69.100.

Catchpoint 3 (call to syscall 'bind'), 0x00007ffff6520307 in bind ()
   from /lib/libc.so.6
(gdb) info registers 
rax            0xffffffffffffffda   -38
rbx            0xb35870 11753584
rcx            0xffffffffffffffff   -1
rdx            0x14 20
rsi            0x7fffffff7d90   140737488321936
rdi            0x8  8
rbp            0x8  0x8
rsp            0x7fffffff7d58   0x7fffffff7d58
r8             0xb  11
r9             0x8000   32768
r10            0x7fffffff7b00   140737488321280
r11            0x202    514
r12            0xb09630 11572784
r13            0xb359f0 11753968
r14            0x2  2
r15            0xc8 200
rip            0x7ffff6520307   0x7ffff6520307 <bind+7>
eflags         0x202    [ IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
---Type <return> to continue, or q <return> to quit---
gs             0x0  0
(gdb) 

Например, здесь% rdi содержит первый bind параметр вызова - дескриптор файла сокета.

Для x86-32 все сложнее, поскольку системные вызовы сокетов реализуются через системный вызов socketcall.Вот почему невозможно установить точку захвата непосредственно на bind.Вы можете найти больше информации об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...