【发布时间】:2019-06-17 10:03:29
【问题描述】:
为了生成堆栈跟踪,我使用了boost::stacktrace。我在 Debian 上有一个构建代理,它正在编译该程序的 unix 和 windows 版本。 Unix 版本使用安装的本机g++ 编译,Windows 交叉编译使用mingw-w64 创建。我对这两个编译都使用libbacktrace 后端。 boost 和 libbacktrace 本身都是在 Debian 机器上使用相同的 mingw-w64 编译器编译的。
在我的CMakeLists.txt 中指定:add_definitions(-DBOOST_STACKTRACE_USE_BACKTRACE)
一个堆栈跟踪是这样生成的:
namespace foo {
class Bar {
public:
void fooBar() {
std::cout << boost::stacktrace::stacktrace() << std::endl;
}
};
}
int main(int argc, char *argv[]) {
foo::Bar bar;
bar.fooBar();
}
当在我的计算机(基本操作系统)上编译和从我的 unix 机器上的构建服务器下载时,这会导致以下输出(使用 -g 且未优化)。
0# foo::Bar::fooBar() in /home/cromon/CLionProjects/test-proj/cmake-build-debug/test-proj
1# main at /home/cromon/CLionProjects/test-proj/main.cpp:31
2# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
3# _start in /home/cromon/CLionProjects/test-proj/cmake-build-debug/test-proj
这是在我的 unix 机器上的构建服务器上创建的二进制文件的输出:
0# foo::Bar::fooBar() in ./test-proj
1# main at /opt/teamcity/2018.2/TeamCity/buildAgent/work/d79789e141c5605f/test-proj/main.cpp:31
2# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
3# _start in ./test-proj
现在,如果我在我的 Windows 机器上使用在 Unix 上使用 mingw 编译的二进制文件,可以观察到以下输出
0# ZN5boost10stacktrace16basic_stacktraceISaINS0_5frameEEE4initEyy at /opt/teamcity/boost/1_69/windows/include/boost-1_69/boost/stacktrace/stacktrace.hpp:75
1# ZN3foo3Bar6fooBarEv at /opt/teamcity/2018.2/TeamCity/buildAgent/work/eb975d0a928ba129/test_proj/main.cpp:22
2# main at /opt/teamcity/2018.2/TeamCity/buildAgent/work/eb975d0a928ba129/test_proj/main.cpp:31
3# _tmainCRTStartup at ./mingw-w64-crt/crt/crtexe.c:336
4# mainCRTStartup at ./mingw-w64-crt/crt/crtexe.c:214
5# register_frame_ctor in C:\WINDOWS\System32\KERNEL32.DLL
6# register_frame_ctor in C:\WINDOWS\SYSTEM32\ntdll.dll
我也尝试遍历帧并在它们上运行boost::core::demangle,但它失败了。
到目前为止,我只能看到 unix 上的编译环境和我的 windows 机器上的运行时环境之间的一个区别。在 Windows 上,我有 g++ 版本 8.2.0,在 unix 上是 6.3.0。这会导致任何问题吗?交叉编译时,还有什么可能导致仅在 windows 上的去重失败?
【问题讨论】:
-
我注意到,它似乎只删除了第一个
_,例如mainCRTStartup实际上被命名为_mainCRTStartup而_tmainCRTStartup将是__tmainCRTStartup。还_ZN3foo3Bar6fooBarEv应该被 GCC 拆解器在线正确拆解...