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

6

我在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() {}

Makefile:

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,64位

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 类的构造函数(它什么也不做,应该等同于默认构造函数),错误就不再出现。


如果那个版本的Intel System Studio包含自己的gdb,你可以试试吗? - Mark Plotnick
我认为我做了,但我不确定我需要做什么。只需从intel_composer bin文件夹中获取gdb可执行文件即可? - user1304680
在我所使用的版本中,系统工作室的bin目录中有一个debuggervars.sh文件。如果该目录在您的搜索路径中,请键入“source debuggervars.sh”,它将设置您的环境,以便您可以通过键入“gdb-ia”来运行英特尔的调试器。 - Mark Plotnick
我刚刚在英特尔开发者社区论坛上发布了交叉帖子 https://software.intel.com/en-us/forums/topic/540685 - Nicu Stiurca
我还没有提交报告。 - user1304680
显示剩余2条评论
2个回答

2

1
我不知道给定代码有什么问题,也不知道调试器为什么会崩溃。你的代码可能没有问题,但是你的编译器可能生成了无效的DWARF调试信息,而你的旧版GDB在处理这些信息时出现了错误。请注意,你正在使用很新的icpc和旧版的GDB,所以这并不奇怪。你的第一步应该是构建当前的GDB(7.8.1),并检查它是否仍然存在问题。如果不幸出现问题,你应该在GDB的bugzilla中报告这个问题。作为解决方法,你也可以尝试使用GCC而不是ICC构建你的源代码。

我想那是对的,错误也会在旧版icc版本中消失。我还会尝试使用更新的gdb。 - user1304680
然后,您可能至少可以提交错误报告(连同测试用例)。 - dbrank0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接