Tyl*_*nry 11 c++ gdb initialization g++ segmentation-fault
在C++中,我知道编译器可以选择以它选择的任何顺序初始化静态对象(受一些约束),并且通常您不能选择或确定静态初始化顺序.
但是,一旦编译了一个程序,编译器就必须决定初始化这些对象的顺序.有没有办法从带有调试符号的编译程序中确定将调用静态构造函数的顺序?
上下文是这样的:我有一个相当大的程序,当它在一个新的工具链下构建时,突然在main()之前进行segfaulting.这是一个静态初始化顺序问题,或者它正在加载的某个库有问题.但是,当我使用gdb进行调试时,崩溃位置只是报告为原始地址而没有任何符号信息或回溯.我想通过在第一个静态初始化对象的构造函数中放置一个断点来决定这两个问题中的哪一个,但我不知道如何判断它是哪个对象.
bdo*_*lan 11
在Linux上的G ++中,静态构造函数和析构函数排序由.ctors和.dtors部分中的函数指针决定.请注意,如果有足够的调试可用,您实际上可以获得回溯:
(gdb) bt
#0 0xb7fe3402 in __kernel_vsyscall ()
#1 0xb7d59680 in *__GI_raise (sig=6)
at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0xb7d5cd68 in *__GI_abort () at abort.c:88
#3 0x08048477 in foo::foo() ()
#4 0x0804844e in __static_initialization_and_destruction_0(int, int) ()
#5 0x0804846a in global constructors keyed to foo_inst ()
#6 0x0804850d in __do_global_ctors_aux ()
#7 0x08048318 in _init ()
#8 0x080484a9 in __libc_csu_init ()
#9 0xb7d4470c in __libc_start_main (main=0x8048414 <main>, argc=1,
ubp_av=0xbfffcbc4, init=0x8048490 <__libc_csu_init>,
fini=0x8048480 <__libc_csu_fini>, rtld_fini=0xb7ff2820 <_dl_fini>,
stack_end=0xbfffcbbc) at libc-start.c:181
#10 0x08048381 in _start () at ../sysdeps/i386/elf/start.S:119
Run Code Online (Sandbox Code Playgroud)
这是安装了libc和libstdc ++的调试符号.如您所见,此处发生的崩溃发生在静态对象foo_inst的foo :: foo()构造函数中.
如果你想进入初始化过程,你可以在__do_global_ctors_aux上设置断点并逐步完成它的反汇编,我想.或者只是等待它崩溃以获得如上所述的回溯.
| 归档时间: |
|
| 查看次数: |
5161 次 |
| 最近记录: |