【发布时间】:2010-11-16 11:57:29
【问题描述】:
在 C++ 中,我知道编译器可以选择以它选择的任何顺序(受一些约束)初始化静态对象,并且通常您无法选择或确定静态初始化顺序。
然而,一旦程序被编译,编译器必须决定初始化这些对象的顺序。有没有办法从带有调试符号的编译程序中确定以什么顺序静态构造函数会被调用吗?
上下文是这样的:我有一个相当大的程序,当它在一个新的工具链下构建时,它在 main() 之前突然出现段错误。这是一个静态初始化顺序问题,或者它正在加载的库之一有问题。但是,当我使用 gdb 进行调试时,崩溃位置只是简单地报告为原始地址,没有任何符号信息或回溯。我想通过在第一个静态初始化对象的构造函数处放置一个断点来确定这两个问题中的哪一个,但我不知道如何判断是哪个对象。
【问题讨论】:
-
你试过用“-g3”标志重新编译吗?这应该会放入大量调试符号供您使用。
-
链接器决定了所有编译单元的最终排序。我相信 g++ 有一些编译指示可能有助于定义顺序。
-
答案是高度特定于平台的,您已经设法为您的平台保密。请公开它,以及您使用的 GDB 版本。
-
另外,请显示您获得的 GDB 堆栈跟踪。很可能包含重要线索。
-
只是回答这些问题,它是 Linux/g++,实际上没有任何堆栈跟踪(只有一个内存地址),即使对程序和库进行了全面调试包括最终成为问题的图书馆。我仍然不知道为什么会这样。
标签: c++ gdb initialization g++ segmentation-fault