相关疑难解决方法(0)

<value optimized out>在gdb中意味着什么?

(gdb) n
134   a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
(gdb) n
(gdb) p a
$30 = <value optimized out>
(gdb) p b
$31 = <value optimized out>
(gdb) p c
$32 = 3735928563
Run Code Online (Sandbox Code Playgroud)

gdb如何优化我的价值?

gdb

58
推荐指数
4
解决办法
9万
查看次数

gdb:显示某些数据的typeinfo

基本上,我想得到typeid(*this).name(),即真正的类型this.

我想在GDB中得到它(不修改源代码).我尝试过,print typeid(*this)但它说typeid未知(因为我没有把它包含在源文件中).

c++ gdb typeid typeinfo

31
推荐指数
4
解决办法
3万
查看次数

gdb:当前上下文中没有符号"i"

在gdb中调试C程序时,我在for循环中有一个断点.我无法打印"i"的值(我得到:在当前上下文中没有符号"i").我可以打印所有其他变量的值.这是正常的吗?

这是循环:

for (i=0; i < datasize; i++){  
    if ( feature_mask[i] > 0 ){  
        k = feature_mask[i] - 1;  
        if (neighbors[k][nmax-1] != 0){
            neighbors[k][nmax-1] = bvalue;  
            feature_mask[i] = -feature_mask[i];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c debugging gdb

22
推荐指数
3
解决办法
4万
查看次数

为什么clang用-O0生成效率低的asm(对于这个简单的浮点和)?

我在llvm clang Apple LLVM 8.0.0版(clang-800.0.42.1)上反汇编代码:

int main() {
    float a=0.151234;
    float b=0.2;
    float c=a+b;
    printf("%f", c);
}
Run Code Online (Sandbox Code Playgroud)

我编译时没有-O规范,但我也试过-O0(给出相同)和-O2(实际上计算值并存储它预先计算)

产生的反汇编如下(我删除了不相关的部分)

->  0x100000f30 <+0>:  pushq  %rbp
    0x100000f31 <+1>:  movq   %rsp, %rbp
    0x100000f34 <+4>:  subq   $0x10, %rsp
    0x100000f38 <+8>:  leaq   0x6d(%rip), %rdi       
    0x100000f3f <+15>: movss  0x5d(%rip), %xmm0           
    0x100000f47 <+23>: movss  0x59(%rip), %xmm1        
    0x100000f4f <+31>: movss  %xmm1, -0x4(%rbp)  
    0x100000f54 <+36>: movss  %xmm0, -0x8(%rbp)
    0x100000f59 <+41>: movss  -0x4(%rbp), %xmm0         
    0x100000f5e <+46>: addss  -0x8(%rbp), %xmm0
    0x100000f63 <+51>: movss  %xmm0, -0xc(%rbp)
    ...
Run Code Online (Sandbox Code Playgroud)

显然它正在做以下事情:

  1. 将两个浮点数加载到寄存器xmm0和xmm1上
  2. 把它们放在堆栈中
  3. 从堆栈加载一个值(不是之前的xmm0)到xmm0
  4. 执行添加. …

c assembly x86-64 compiler-optimization llvm-codegen

4
推荐指数
1
解决办法
333
查看次数

-O0,-O1和-g之间有什么区别?

我想知道使用-O0,-O1和-g来启用lib中的调试符号.有些人建议使用-O0来启用调试符号,有些人建议使用-g.

那么-g和-O0之间的实际差异是什么?-01和-O0之间的区别是什么,哪个最好用.

c c++ gcc

1
推荐指数
2
解决办法
3455
查看次数