为什么在gdb中跳过某些语句?

时间:2011-06-04 03:20:36

标签: gdb

我正在调试此代码:

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++) {

我以前也经历过这种情况,但从来不知道原因,有谁知道?

这是一个错误吗?

更新

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>

更新

在使用gdb时,没有其他人遇到同样的事情?调试时经常发生这种情况。

2 个答案:

答案 0 :(得分:1)

最有可能将这两个语句优化为单个set-and-test表达式,然后不能将其分解为原始的两行。生成的伪代码可能类似于

call _malloc
jz _failed
mov acc, _ngx_sys_errlist

现在在测试之前进行测试;您是否让源级别跟踪向后反映这一点?

答案 1 :(得分:0)

请检查,
a)如果你正在调试发布版本(如果有的话)
b)如果您的源文件被修改

如果您仍有问题,请提供详细信息(Complier with version,degugger version,platform and code ...)