GCC没有在-Og中的调试信息中发出所有行号

时间:2016-08-08 09:01:13

标签: c linux gcc gdb dwarf

我试图教我的同事使用GDB并创建了一个示例来说明如何逐步执行代码。使用-O0进行编译很顺利,代码逐行执行,但是在使用-Og进行编译时(我将向同事推荐......)它只会触及一些行(第11,13,15行) ,下面的20和25)。

查看elf文件中的debug-info,看起来只包含了一些行号。通过反汇编来看,代码几乎完全相同,并且在使用-Og构建时,线条的优化并不明显。

有人可以向我解释为什么针对调试优化的优化在生成行号时失败了吗?

是否有原因无法生成我无法看到的行信息?或者我在编译时遗漏了什么?或者这是GCC的已知错误?

代码:

#include <stdio.h>

struct ABC{
  int a;
  unsigned int b;
  char c;
};

#define MY_CONST 3

int main(){ // line #11
  int var = 0x12345678;
  char str[] = "Hello World!"; //line #13
  char* ptr1 = &str[6];
  struct ABC abc = {-1, 1, 'a'}; // line #15
  struct ABC abc_array[] = {{-1, 1, 'A'}, {-2, 2, 'B'}, {-3, 3, 'C'}};

  void * ptr2 = &abc_array;

  printf("var = 0x%x\n", var); //line #20
  printf("str = %s\n", str);
  printf("ptr1 = %s\n", ptr1);
  printf("&abc = %p\n", &abc);
  printf("MY_CONST = %d\n", MY_CONST);
} //line #25

汇编:

gcc -g -Og main.c -o exercise2.elf

Dwarfdump:

.debug_line: line number info for a single cu
Source lines (from CU-DIE at .debug_info offset 0x0000000b):

<pc>        [row,col] NS BB ET PE EB IS= DI= uri: "filepath"
NS new statement, BB new basic block, ET end of text sequence
PE prologue end, EB epilogue begin
IA=val ISA number, DI=val discriminator value
0x004005b6  [  11, 0] NS uri: "/home/developer/Courses/Debugging/Exercises/Exercise 2/main.c"
0x004005ba  [  11, 0] NS
0x004005ca  [  13, 0] NS
0x004005e6  [  15, 0] NS
0x004005fa  [ 104, 0] NS uri: "/usr/include/x86_64-linux-gnu/bits/stdio2.h"
0x00400675  [  25, 0] NS uri: "/home/developer/Courses/Debugging/Exercises/Exercise 2/main.c"
0x00400694  [  25, 0] NS ET 

请注意,GDB没有停止的第20行的行信息!

0 个答案:

没有答案