У меня очень простая программа, которая не делает ничего, кроме вызова recvfrom()
в цикле. Согласно его manpage , один из аргументов является указателем на длину адреса. Этот адрес инициализируется в разделе .data
целочисленным значением 16
. Я заметил странное поведение, когда я присоединяюсь к уже запущенному процессу, чтобы отследить его, которого нет, когда я отслеживаю процесс напрямую (когда я запускаю его отслеживание). Прокрутите до конца строки:
# strace -x -s 10 -e trace=recvfrom ./test
recvfrom(3, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 32, 0, {sa_family=AF_INET, sin_port=htons(42134), sin_addr=inet_addr("127.0.0.1")}, [16]) = 32
recvfrom(3, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 32, 0, {sa_family=AF_INET, sin_port=htons(49442), sin_addr=inet_addr("127.0.0.1")}, [16]) = 32
recvfrom(3, ^Cstrace: Process 18909 detached
<detached ...>
# ./test &
# strace -x -s 10 -e trace=recvfrom -p $!
strace: Process 18916 attached
recvfrom(3, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 32, 0, {sa_family=AF_INET, sin_port=htons(50906), sin_addr=inet_addr("127.0.0.1")}, [1999040176->16]) = 32
recvfrom(3, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 32, 0, {sa_family=AF_INET, sin_port=htons(52956), sin_addr=inet_addr("127.0.0.1")}, [16]) = 32
recvfrom(3, ^Cstrace: Process 18916 detached
<detached ...>
Когда я отслеживаю это напрямую, аргумент длины адреса отображается как [16]
, что имеет смысл. В конце концов, адрес является указателем на int
значения 16
. Однако, когда я присоединяюсь к процессу и отслеживаю его, самый первый вызов показывает, что он не инициализирован, например, [1999040176->16]
. Это происходит для первого системного вызова каждый раз, когда я присоединяюсь, но все последующие вызовы показывают его правильно как [16]
. Если я отсоединюсь от процесса и снова присоединюсь, первый вызов покажет, что он имеет неинициализированную память.
Короче говоря:
Когда я запускаю его под strace
, последний аргумент показывает [16]
для каждого recvfrom()
.
Когда я присоединяюсь к нему, когда он уже запущен, последний аргумент показывает такие вещи, как [1999040176->16]
в первом вызове recvfrom()
и [16]
во всех последующих.
Если я отсоединяюсь от него и присоединяюсь снова, первый вызов recvfrom()
снова отображает это странное поведение, а все последующие вызовы отображают ожидаемое [16]
.
Это не вопрос программирования, потому что я знаю, что сама программа верна. Если это имеет значение, то вот программа (написанная в сборке MIPS):
.section .text
.global __start
__start:
# socket
li $v0,4183
li $a0,2
li $a1,1
li $a2,0
syscall
sw $v0,sockfd
# bind
li $v0,4169
lw $a0,sockfd
la $a1,sockaddr_b
li $a2,16
syscall
loop:
# recvfrom
li $v0,4176
lw $a0,sockfd
la $a1,buffer
li $a2,32
li $a3,0
la $t0,sockaddr_a
sw $t0,16($sp)
la $t0,addrlen
sw $t0,20($sp)
syscall
j loop
.section .bss
sockaddr_a: .space 16
buffer: .space 32
sockfd: .space 4
.section .data
addrlen: .int 16
.section .rodata
sockaddr_b: .hword 2,1234,0,0