2012-03-13 9 views
1

gdbを使用すると、関数に渡されるパラメータの良いリストが得られることがよくあります。しかし、bindのような特定の機能で、私はパラメータを得ることはありません: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 
... 

私はまだパラメータがこれらの関数に渡さ取得できますか?

+0

使用しているOSは何ですか? x64またはx86?答えはアーキテクチャに依存します。 – ks1322

+0

x86_64でも、x86にも興味があります。 – Lekensteyn

答えて

1

bindは、ソケットシステムコールの1つです。 gdb-catch syscall <syscall name>のシステムコールにブレークポイントを設定する特別な方法があります。この種のブレークポイントヒットの後、kernel calling conventionsに従ってレジスタ内の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に直接キャッチポイントを置くことが不可能なのですか?あなたはそれについての詳細情報を見つけることができますhere

関連する問題