有没有办法获得链接到Go的CGO代码的调试符号?

时间:2017-05-18 20:18:00

标签: debugging go lldb

我有一些Cgo代码,我正在链接到我的Go二进制文件中。我已经运行Cgo并构建我的代码和包装器。在最近的一些更改之后,我开始在我的C ++中获得双重自由,我正在链接。我已经尝试在lldb下运行我的二进制文件并且它确实捕获了malloc恐慌,但这些符号并不是特别有用。

在vanilla C或C ++中,我使用Spacing来获取包含变量名和源的丰富调试符号。这使得使用lldb更有效率。但是,我有一些问题让这些符号显示在我的二进制文件中。我注意到在回溯中我的函数显示为-g3,其中foo是我的函数的名称。虽然没有其他调试信息,但我得到的只是汇编和内存指针/寄存器的痕迹。

我尝试使用main'foo调用go build,但二进制文件仍然没有符号。我还尝试将CGO_CFLAGS="-g3" CGO_CXXFLAGS="-g3"添加到我的.go文件中的CFLAGS / CXXFLAGS,我在其中设置了其他标志(在-g3之前),但这似乎也不起作用。我想不出有任何其他方法可以将这些调试信息添加到我的二进制文件中 - 是否有一些Go特定的标志或构建序列可以启用它?

1 个答案:

答案 0 :(得分:0)

我不知道go& C ++链接工作。但是,有关如何在OS X上处理调试信息的简要说明可能有助于您确定调试信息丢失的位置。

在大多数系统上的OS X上,单个源文件compile的调试信息将进入由它生成的.o文件中。您可以通过各种方式验证.o文件是否获得了调试信息,其中包括:

 lldb -o "image dump sections" Target.o --batch | grep DWARF
  0x00000300 container        [0x0000000000061538-0x0000000000782c77)  rwx  0x00061cb8 0x0072173f 0x00000000 Target.o.__DWARF
  0x00000009 dwarf-str        [0x0000000000061538-0x00000000004eeabc)  rwx  0x00061cb8 0x0048d584 0x02000000 Target.o.__DWARF.__debug_str
  0x0000000a dwarf-loc        [0x00000000004eeabc-0x00000000004ef493)  rwx  0x004ef23c 0x000009d7 0x02000000 Target.o.__DWARF.__debug_loc
  0x0000000b dwarf-abbrev     [0x00000000004ef493-0x00000000004f09a7)  rwx  0x004efc13 0x00001514 0x02000000 Target.o.__DWARF.__debug_abbrev
  0x0000000c dwarf-info       [0x00000000004f09a7-0x00000000006ea7f1)  rwx  0x004f1127 0x001f9e4a 0x02000000 Target.o.__DWARF.__debug_info
  0x0000000d dwarf-ranges     [0x00000000006ea7f1-0x00000000006ec481)  rwx  0x006eaf71 0x00001c90 0x02000000 Target.o.__DWARF.__debug_ranges
  0x0000000e dwarf-macinfo    [0x00000000006ec481-0x00000000006ec482)  rwx  0x006ecc01 0x00000001 0x02000000 Target.o.__DWARF.__debug_macinfo
  0x0000000f apple-names      [0x00000000006ec482-0x000000000071134e)  rwx  0x006ecc02 0x00024ecc 0x02000000 Target.o.__DWARF.__apple_names
  0x00000010 apple-objc       [0x000000000071134e-0x0000000000711372)  rwx  0x00711ace 0x00000024 0x02000000 Target.o.__DWARF.__apple_objc
  0x00000011 apple-namespaces [0x0000000000711372-0x00000000007116d6)  rwx  0x00711af2 0x00000364 0x02000000 Target.o.__DWARF.__apple_namespac
  0x00000012 apple-types      [0x00000000007116d6-0x0000000000748797)  rwx  0x00711e56 0x000370c1 0x02000000 Target.o.__DWARF.__apple_types
  0x00000015 dwarf-line       [0x000000000075d348-0x0000000000782c77)  rwx  0x0075dac8 0x0002592f 0x02000000 Target.o.__DWARF.__debug_line

如果您在此处没有看到任何内容,则编译器不会发出调试信息...

下一步特定于Darwin,而不是将调试信息放入链接阶段的输出中,调试信息保留在.o文件中,并且“调试映射”插入到输出图像中。这就是调试器找回返回.o文件的方式。你可以看到:

$ nm -ap <YourBinary> | grep OSO

您应该会在此处看到所有.o文件的列表。如果你没有那么在构建过程中的某个时刻你的二进制文件被剥离(至少使用strip -S)你必须找出发生的时间而不是那样做。还要检查.o文件是否仍然是您从上面的命令中看到的条目所说的。可能是构建过程的某些部分正在移动它们,调试器再也找不到它们了。