GDB在启动时崩溃(内部错误:follow_die_offset)

use*_*680 6 c++ linux gdb

我在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.
Run Code Online (Sandbox Code Playgroud)

我已经将项目强烈简化为以下代码并仍然得到相同的错误:

BH:

#ifndef B_H_
#define B_H_

#include <vector>
class B {
public:
    B();
    std::vector<double> p;
};

#endif /* B_H_ */
Run Code Online (Sandbox Code Playgroud)

B.cpp:

#include "B.h"
B::B() {}
Run Code Online (Sandbox Code Playgroud)

DH:

#ifndef D_H_
#define D_H_

#include "E.h"

class D: public E {
public:
    D();
};

#endif /* D_H_ */
Run Code Online (Sandbox Code Playgroud)

D.cpp:

#include "D.h"

D::D() : E() {}
Run Code Online (Sandbox Code Playgroud)

诶:

#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_ */
Run Code Online (Sandbox Code Playgroud)

E.cpp:

#include "E.h"

void E::set(const std::function<double(void)>& f) {
    e = f;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

int main() {}
Run Code Online (Sandbox Code Playgroud)

生成文件:

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 
Run Code Online (Sandbox Code Playgroud)

如果我这样做会发生错误:

gdb Test
Run Code Online (Sandbox Code Playgroud)

然后调用

run
Run Code Online (Sandbox Code Playgroud)

在gdb CLI中.

我的系统:

打开Suse 12.3,64bit

icpc --version:

icpc (ICC) 15.0.1 20141023
Run Code Online (Sandbox Code Playgroud)

icpc -v:

icpc version 15.0.1 (gcc version 4.7.0 compatibility)
Run Code Online (Sandbox Code Playgroud)

gdb --version:

GNU gdb (GDB) SUSE (7.5.1-2.1.1)
Run Code Online (Sandbox Code Playgroud)

gcc --version:

gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012]
Run Code Online (Sandbox Code Playgroud)

我不知道给定代码有什么问题以及调试器崩溃的原因.例如,如果我注释掉类B的构造函数(它什么也不做,应该等同于默认构造函数),则错误不再出现.

Emp*_*ian 1

我不知道给定的代码有什么问题以及调试器崩溃的原因。

您的代码可能没有任何问题,但您的编译器可能会生成无效的 DWARF 调试信息,而您的旧GDB肯定有一个处理该问题的错误。

请注意,您正在使用非常新的icpc旧 GDB,因此这并不奇怪。

您的第一步应该是构建当前的 GDB (7.8.1) 并检查它是否仍然有问题。

万一出现这种情况,您应该在 GDB bugzilla中报告它。

作为解决方法,您还可以尝试使用 GCC 而不是 ICC 构建源代码。