Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将调试符号拆分为dwo dwarf文件时,gdb找不到符号_C++_Linux_Linker_Gdb - Fatal编程技术网

C++ 将调试符号拆分为dwo dwarf文件时,gdb找不到符号

C++ 将调试符号拆分为dwo dwarf文件时,gdb找不到符号,c++,linux,linker,gdb,C++,Linux,Linker,Gdb,我想用g++构建一个二进制文件,并将调试信息拆分为一个单独的文件。所谓的调试裂变 假设您在一个文件夹中。有一个文件src/main.cpp的内容很简单:int main(){} 我想用-gsplit-dwarf编译它: mkdir -p obj (cd obj && g++ -c -g -gsplit-dwarf ../src/main.cpp -o main.o) g++ -Wl,--gdb-index -fuse-ld=gold obj/*.o -o main 我想在ma

我想用
g++
构建一个二进制文件,并将调试信息拆分为一个单独的文件。所谓的
调试裂变

假设您在一个文件夹中。有一个文件
src/main.cpp
的内容很简单:
int main(){}

我想用
-gsplit-dwarf
编译它:

mkdir -p obj
(cd obj && g++ -c -g -gsplit-dwarf ../src/main.cpp -o main.o)
g++ -Wl,--gdb-index -fuse-ld=gold  obj/*.o -o main
我想在
main
函数中设置一个断点:

gdb main
(gdb) b main
Breakpoint 1 at 0x40058a: file ../src/main.cpp, line 2.
(gdb) r
Breakpoint 1, main () at ../src/main.cpp:2
2       ../src/main.cpp: No such file or directory.
但是,
gdb
找不到符号。它尝试查找与
obj
目录相关的符号

我遗漏了一些论点吗

我使用以下版本:
gcc-4.9.3
binutils-2.26.1
gdb-7.11.1

一些额外信息:

readelf-wi main
.debug_info部分的内容:
...
DW_AT_GNU_dwo_name:(间接字符串,偏移量:0x0):main.dwo
DW_AT_comp_dir:(间接字符串,偏移量:0x9):/tmp/blah/obj
地址:0xf4f335f2e5c313e0
readelf-wi obj/main.dwo
.debug_info.dwo部分的内容:
...
DWIATATIGER:(索引字符串:0x0):GNU C++ 4.4.3- MUNTY =泛型-行进=X8664 -G-GPLACK -FASTF保护器强
DW_AT_语言:4(C++)
DW_AT_name:(索引字符串:0x3):../src/main.cpp
DW_AT_comp_dir:(索引字符串:0x1):/tmp/blah/obj
地址:0xf4f335f2e5c313e0
...

Update:如果我将
g++
替换为
clang++
,它会起作用。似乎这个问题在某种程度上与
gcc
有关。
readelf -wi main
Contents of the .debug_info section:
...
<20>   DW_AT_GNU_dwo_name: (indirect string, offset: 0x0): main.dwo
<24>   DW_AT_comp_dir    : (indirect string, offset: 0x9): /tmp/blah/obj
<2c>   DW_AT_GNU_dwo_id  : 0xf4f335f2e5c313e0

readelf -wi obj/main.dwo
Contents of the .debug_info.dwo section:
...
<c>   DW_AT_producer    : (indexed string: 0x0): GNU C++ 4.9.3 -mtune=generic -march=x86-64 -g -gsplit-dwarf -fstack-protector-strong
<d>   DW_AT_language    : 4 (C++)
<e>   DW_AT_name        : (indexed string: 0x3): ../src/main.cpp
<f>   DW_AT_comp_dir    : (indexed string: 0x1): /tmp/blah/obj
<10>   DW_AT_GNU_dwo_id  : 0xf4f335f2e5c313e0
...