Почему некоторые операторы пропускаются в GDB? - PullRequest
0 голосов
/ 04 июня 2011

Я отлаживаю этот код:

len = NGX_SYS_NERR * sizeof(ngx_str_t);

ngx_sys_errlist = malloc(len);
if (ngx_sys_errlist == NULL) {
    goto failed;
}

for (err = 0; err < NGX_SYS_NERR; err++) {

Но в GDB if (ngx_sys_errlist == NULL) { пропускается напрямую:

(gdb) 
59      ngx_sys_errlist = malloc(len);
(gdb) n
64      for (err = 0; err < NGX_SYS_NERR; err++) {

Я тоже испытывал это раньше, но никогда не знает причину, кто-нибудь знает?

Это ошибка?

UPDATE

0x000000000041be9d <ngx_strerror_init+0>:   mov    %rbx,-0x30(%rsp)
0x000000000041bea2 <ngx_strerror_init+5>:   mov    %rbp,-0x28(%rsp)
0x000000000041bea7 <ngx_strerror_init+10>:  mov    %r12,-0x20(%rsp)
0x000000000041beac <ngx_strerror_init+15>:  mov    %r13,-0x18(%rsp)
0x000000000041beb1 <ngx_strerror_init+20>:  mov    %r14,-0x10(%rsp)
0x000000000041beb6 <ngx_strerror_init+25>:  mov    %r15,-0x8(%rsp)
0x000000000041bebb <ngx_strerror_init+30>:  sub    $0x38,%rsp
0x000000000041bebf <ngx_strerror_init+34>:  mov    $0x840,%edi
0x000000000041bec4 <ngx_strerror_init+39>:  callq  0x402388 <malloc@plt>
0x000000000041bec9 <ngx_strerror_init+44>:  mov    %rax,0x26e718(%rip)        # 0x68a5e8 <ngx_sys_errlist>
0x000000000041bed0 <ngx_strerror_init+51>:  mov    $0x840,%r12d
0x000000000041bed6 <ngx_strerror_init+57>:  test   %rax,%rax
0x000000000041bed9 <ngx_strerror_init+60>:  je     0x41bf56 <ngx_strerror_init+185>
0x000000000041bedb <ngx_strerror_init+62>:  mov    $0x0,%r13d
0x000000000041bee1 <ngx_strerror_init+68>:  mov    $0x0,%r14d
0x000000000041bee7 <ngx_strerror_init+74>:  mov    $0x0,%r15d
0x000000000041beed <ngx_strerror_init+80>:  mov    %r13d,%edi
0x000000000041bef0 <ngx_strerror_init+83>:  callq  0x402578 <strerror@plt>

UPDATE

Никто еще не сталкивался с тем же при использовании gdb? Это часто случается со мной при отладке.

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Скорее всего, два оператора были оптимизированы в одно выражение set-and-test, которое затем нельзя разложить на две исходные строки.Сгенерированный псевдокод, вероятно, будет что-то вроде

call _malloc
jz _failed
mov acc, _ngx_sys_errlist

, где тест теперь происходит перед назначением;Вы позволяете трассировке уровня источника вернуться назад, чтобы отразить это?

0 голосов
/ 04 июня 2011

пожалуйста, проверьте,
а) если вы отлаживаете сборку релиза (если она есть)
б) если ваш исходный файл изменен

если проблема не устранена, предоставьте подробную информацию (Соответствует версии, версии дегаггера, платформе и коду ...)

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