boost::stacktrace Windows MSVS 2017
boost::stacktrace on Windows MSVS 2017
当我的 Windows 应用程序崩溃时,我想要回溯。 Boost stacktrace 看起来很有趣,我在 Linux 中玩了一下;但是,我在 Windows!
中从 safe_dump_to()
得到零结果
我想我做了一个简单的疏忽,我希望有人能提供帮助。
我将 MSVS2017 编译器与 ninja 和 CMake 一起使用。
我已经使用这些标志构建了 Boost v1.67:
link=static address-model=64 variant=release threading=multi
我 运行 boost_1_67_0/libs/stacktrace/test/
中的测试以确保我正确构建了库。
这是我的 CMake 文件,注意我使用了 -DCMAKE_BUILD_TYPE=RelWithDebInfo
:
cmake_minimum_required(VERSION 3.0)
set( target_name stacktrace_test)
# boost
set(Boost_USE_STATIC_LIBS ON)
find_package( Boost REQUIRED COMPONENTS date_time filesystem thread
system stacktrace_windbg)
add_executable(${target_name} main.cpp)
set_property(TARGET ${target_name} PROPERTY CXX_STANDARD 14 )
target_compile_definitions(${target_name} PUBLIC
BOOST_ALL_NO_LIB=1 # disable pragama inclusion
BOOST_STACKTRACE_LINK=1
BOOST_STACKTRACE_USE_WINDBG=1
)
target_include_directories(${target_name} SYSTEM PUBLIC
${Boost_INCLUDE_DIRS}
)
target_link_libraries(${target_name}
${Boost_LIBRARIES} # boost
dbgeng
ole32
)
这是我的代码,基于 Boost stactrace 的入门页面:
#include <iostream>
#include <signal.h> // ::signal, ::raise
#include <boost/stacktrace/stacktrace.hpp>
#include <boost/filesystem.hpp>
void handler(int signum)
{
::signal(signum, SIG_DFL);
size_t result = boost::stacktrace::safe_dump_to("./backtrace.dump");
std::cout << " " << result << std::endl;
::raise(SIGABRT);
}
void crash()
{
abort();
}
int main(int,char**)
{
::signal(SIGSEGV, &handler);
::signal(SIGABRT, &handler);
if(boost::filesystem::exists("backtrace.dump")) // existing stacktrace?
{
std::ifstream ifs("backtrace.dump");
boost::stacktrace::stacktrace st =
boost::stacktrace::stacktrace::from_dump(ifs);
std::cout << "Stacktrace from prior run:\n" << st << std::endl;
ifs.close(); // cleanup
boost::filesystem::remove("backtrace.dump");
return 0;
}
crash();
return 0;
}
这是我的编译输出:
C:\SRC\sandbox\boost\stacktrace\win-simple\Build_RWD>ninja -v
[1/2 50%]:C:\PROGRA~2\MICROS~117\BUILDT~1\VC\Tools\MSVC13~1.261\bin\Hostx64\x64\cl.exe /nologo /TP -DBOOST_ALL_NO_LIB=1 -DBOOST_STACKTRACE_LINK=1 -DBOOST_STACKTRACE_USE_WINDBG=1 -IC:rd_libs\boost\boost_1_67_0 /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MD /Zi /O2 /Ob1 /DNDEBUG -std:c++14 /showIncludes /FoCMakeFiles\stacktrace_test.dir\main.cpp.obj /FdCMakeFiles\stacktrace_test.dir\ /FS -c ..\main.cpp
[2/2 100%]:cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\stacktrace_test.dir --manifests -- C:\PROGRA~2\MICROS~117\BUILDT~1\VC\Tools\MSVC13~1.261\bin\Hostx64\x64\link.exe /nologo CMakeFiles\stacktrace_test.dir\main.cpp.obj /out:stacktrace_test.exe /implib:stacktrace_test.lib /pdb:stacktrace_test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_date_time.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_filesystem.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_thread.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_system.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_stacktrace_windbg.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_chrono.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_atomic.lib dbgeng.lib ole32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK : stacktrace_test.exe not found or not built by the last incremental link; performing full link
我查看了编译标志,但没有任何问题。
感谢任何帮助!
谢谢,
某人
事实证明,boost::stacktrace 中的功能在 windows 中被禁用,因为据报道它可能会导致死锁。 Re-enabling stacktrace/detail/safe_dump_win.ipp
中的代码解决了我的问题。
请注意,我以 safe_dump_win.ipp
、frame_msvc.ipp
和 frame_unwind.ipp
的 github 开发版本作为我的起点。
在我的有限测试中,我没有看到死锁。如果软件死锁,我的情况不会比它悄悄崩溃更糟糕,希望我能得到比死锁更多的痕迹!
当我的 Windows 应用程序崩溃时,我想要回溯。 Boost stacktrace 看起来很有趣,我在 Linux 中玩了一下;但是,我在 Windows!
中从safe_dump_to()
得到零结果
我想我做了一个简单的疏忽,我希望有人能提供帮助。
我将 MSVS2017 编译器与 ninja 和 CMake 一起使用。
我已经使用这些标志构建了 Boost v1.67:
link=static address-model=64 variant=release threading=multi
我 运行 boost_1_67_0/libs/stacktrace/test/
中的测试以确保我正确构建了库。
这是我的 CMake 文件,注意我使用了 -DCMAKE_BUILD_TYPE=RelWithDebInfo
:
cmake_minimum_required(VERSION 3.0)
set( target_name stacktrace_test)
# boost
set(Boost_USE_STATIC_LIBS ON)
find_package( Boost REQUIRED COMPONENTS date_time filesystem thread
system stacktrace_windbg)
add_executable(${target_name} main.cpp)
set_property(TARGET ${target_name} PROPERTY CXX_STANDARD 14 )
target_compile_definitions(${target_name} PUBLIC
BOOST_ALL_NO_LIB=1 # disable pragama inclusion
BOOST_STACKTRACE_LINK=1
BOOST_STACKTRACE_USE_WINDBG=1
)
target_include_directories(${target_name} SYSTEM PUBLIC
${Boost_INCLUDE_DIRS}
)
target_link_libraries(${target_name}
${Boost_LIBRARIES} # boost
dbgeng
ole32
)
这是我的代码,基于 Boost stactrace 的入门页面:
#include <iostream>
#include <signal.h> // ::signal, ::raise
#include <boost/stacktrace/stacktrace.hpp>
#include <boost/filesystem.hpp>
void handler(int signum)
{
::signal(signum, SIG_DFL);
size_t result = boost::stacktrace::safe_dump_to("./backtrace.dump");
std::cout << " " << result << std::endl;
::raise(SIGABRT);
}
void crash()
{
abort();
}
int main(int,char**)
{
::signal(SIGSEGV, &handler);
::signal(SIGABRT, &handler);
if(boost::filesystem::exists("backtrace.dump")) // existing stacktrace?
{
std::ifstream ifs("backtrace.dump");
boost::stacktrace::stacktrace st =
boost::stacktrace::stacktrace::from_dump(ifs);
std::cout << "Stacktrace from prior run:\n" << st << std::endl;
ifs.close(); // cleanup
boost::filesystem::remove("backtrace.dump");
return 0;
}
crash();
return 0;
}
这是我的编译输出:
C:\SRC\sandbox\boost\stacktrace\win-simple\Build_RWD>ninja -v
[1/2 50%]:C:\PROGRA~2\MICROS~117\BUILDT~1\VC\Tools\MSVC13~1.261\bin\Hostx64\x64\cl.exe /nologo /TP -DBOOST_ALL_NO_LIB=1 -DBOOST_STACKTRACE_LINK=1 -DBOOST_STACKTRACE_USE_WINDBG=1 -IC:rd_libs\boost\boost_1_67_0 /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MD /Zi /O2 /Ob1 /DNDEBUG -std:c++14 /showIncludes /FoCMakeFiles\stacktrace_test.dir\main.cpp.obj /FdCMakeFiles\stacktrace_test.dir\ /FS -c ..\main.cpp
[2/2 100%]:cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\stacktrace_test.dir --manifests -- C:\PROGRA~2\MICROS~117\BUILDT~1\VC\Tools\MSVC13~1.261\bin\Hostx64\x64\link.exe /nologo CMakeFiles\stacktrace_test.dir\main.cpp.obj /out:stacktrace_test.exe /implib:stacktrace_test.lib /pdb:stacktrace_test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_date_time.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_filesystem.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_thread.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_system.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_stacktrace_windbg.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_chrono.lib C:rd_libs\boost\boost_1_67_0\stage\lib\libboost_atomic.lib dbgeng.lib ole32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK : stacktrace_test.exe not found or not built by the last incremental link; performing full link
我查看了编译标志,但没有任何问题。
感谢任何帮助! 谢谢, 某人
事实证明,boost::stacktrace 中的功能在 windows 中被禁用,因为据报道它可能会导致死锁。 Re-enabling stacktrace/detail/safe_dump_win.ipp
中的代码解决了我的问题。
请注意,我以 safe_dump_win.ipp
、frame_msvc.ipp
和 frame_unwind.ipp
的 github 开发版本作为我的起点。
在我的有限测试中,我没有看到死锁。如果软件死锁,我的情况不会比它悄悄崩溃更糟糕,希望我能得到比死锁更多的痕迹!