Почему strace считает, что эта память не инициализирована при подключении к процессу? - PullRequest
0 голосов
/ 12 мая 2018

У меня очень простая программа, которая не делает ничего, кроме вызова 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
...