我在Linux下有一个小型的C ++项目。当我尝试使用gdb调试可执行文件时,我收到以下错误:
../../gdb/dwarf2read.c:16760: internal-error: follow_die_offset:
Assertion 'dwarf2_per_objfile->reading_partial_symbols' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
我已经将项目强烈简化为以下代码,但仍然会出现同样的错误:
B.h:
#ifndef B_H_
#define B_H_
#include <vector>
class B {
public:
B();
std::vector<double> p;
};
#endif /* B_H_ */
B.cpp:
#include "B.h"
B::B() {}
D.h:
#ifndef D_H_
#define D_H_
#include "E.h"
class D: public E {
public:
D();
};
#endif /* D_H_ */
D.cpp:
#include "D.h"
D::D() : E() {}
E.h:
#ifndef E_H_
#define E_H_
#include <functional>
class E {
public:
void set(const std::function<double(void)>& f);
std::function<double(void)> e;
};
#endif /* E_H_ */
E.cpp:
#include "E.h"
void E::set(const std::function<double(void)>& f) {
e = f;
}
main.cpp中:
int main() {}
生成文件:
all: Test
%.o: %.cpp
icpc -c -std=c++11 -g -o $@ $<
Test: main.o D.o E.o B.o
icpc -std=c++11 -o $@ $^
clean:
rm -f D.o E.o B.o Test main.o
.PHONY: all clean
如果我这样做会发生错误:
gdb Test
然后调用
run
在gdb CLI中。
我的系统:
Open Suse 12.3,64bit
icpc --version:
icpc (ICC) 15.0.1 20141023
icpc -v:
icpc version 15.0.1 (gcc version 4.7.0 compatibility)
gdb --version:
GNU gdb (GDB) SUSE (7.5.1-2.1.1)
gcc --version:
gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012]
我不知道给定代码有什么问题以及调试器崩溃的原因。例如,如果我注释掉类B的构造函数(它什么也不做,应该等同于默认构造函数),则错误不再出现。
答案 0 :(得分:2)
请参阅此主题:https://software.intel.com/en-us/forums/topic/540685 - 它似乎是gdb中的一个问题,已在7.9中修复。 更新我将gdb升级到7.9,问题真的消失了,对我来说至少。
答案 1 :(得分:1)
我不知道给定代码有什么问题以及调试器崩溃的原因。
您的代码可能没有任何问题,但您的编译器可能会生成无效的DWARF调试信息,而您的某些旧 GDB肯定有一个错误处理。
请注意,您使用的是新版icpc
旧版GDB,因此这并不奇怪。
您的第一步应该是构建当前的GDB(7.8.1)并检查它是否仍有问题。
在不太可能发生的情况下,您应该在GDB bugzilla中报告。
作为解决方法,您也可以尝试使用GCC而不是ICC构建源代码。