- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我的 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~1\2017\BUILDT~1\VC\Tools\MSVC\1413~1.261\bin\Hostx64\x64\cl.exe /nologo /TP -DBOOST_ALL_NO_LIB=1 -DBOOST_STACKTRACE_LINK=1 -DBOOST_STACKTRACE_USE_WINDBG=1 -IC:\3rd_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~1\2017\BUILDT~1\VC\Tools\MSVC\1413~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:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_date_time.lib C:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_filesystem.lib C:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_thread.lib C:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_system.lib C:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_stacktrace_windbg.lib C:\3rd_libs\boost\boost_1_67_0\stage\lib\libboost_chrono.lib C:\3rd_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 中被禁用,因为据报道它可能会导致死锁。重新启用 stacktrace/detail/safe_dump_win.ipp
中的代码为我解决了这个问题。
请注意,我以 safe_dump_win.ipp
、frame_msvc.ipp
和 frame_unwind.ipp
的 github 开发版本作为我的起点。
在我有限的测试中,我没有看到死锁。如果出现软件死锁,我的情况不会比它悄悄崩溃更糟,而且希望我得到的痕迹比死锁多!
关于c++ - Windows MSVS 2017 上的 boost::stacktrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088322/
我希望这个问题能够在 SO 的规则下存活下来,因为我进行了很多搜索,没有找到关于它的文档,有时甚至忽略了它,但这让我既不理解问题也不理解解决方案。 Exceptoion 的 StackeTrace 有
我正在Gradle项目中设置Spotbugs,但是当我运行它时,Spotbugs会生成输出报告,但是将失败的堆栈跟踪记录到控制台。我想知道是否有办法抑制它。 这是我的Gradle文件: buildsc
这是我执行类的主要方法的任务,该类在Java项目的build.gradle中定义: task(runClass, type: JavaExec) { try { main =
我遇到了一个意外错误,它创建了包含大量行和不同库的 stackTrace。如果从上到下阅读,可以看到除了第2-3个方法之外的每个被调用的方法。看起来像 //Pseudo code method1_1(
我正在尝试将 gradle java 应用程序部署到 heroku (基于 jhipster)。我可以使用“heroku local”在本地构建并运行它,但是当我尝试远程部署它时,当它尝试构建应用程序
以下异常: Exception in thread "main" java.lang.NullPointerException at javaapplication7.App.main(App.jav
我需要按关键字从日志文件中 grep 完整的堆栈跟踪。 这段代码工作正常,但在大文件上会变慢(比文件更慢)。 我认为改进正则表达式以查找关键字的最佳方法,但我无法完成。 #!/usr/bin/perl
我在托管应用程序中收到错误消息,我正在尝试了解错误发生的原因。 为此,我查看了错误页面上的堆栈跟踪,如下所示: [ NullReferenceException: Object reference n
我的日志库中有这段代码 var stackTrace = new StackTrace(); string operationName = stackTrace.GetFrame(1).GetMeth
我们正在运行多个 Sitecore 网站,并且刚刚收到反馈,在出现错误时向网站用户提供堆栈跟踪可能很危险。既然人们获得了堆栈跟踪信息,该网站是否会更容易受到黑客攻击? 最佳答案 这绝对是弊大于利。根据
我们正在使用 Rational Application Developer 7.5(基于 Eclipse 3.4)为 WebSphere Application Server 6.1 开发一个 Web
给定以下流畅的 API 调用: Foo() .Bar1(() => { ... }) .Bar2(() => { ... }) .Bar3(); 我想稍后确定代码文件和 Bar
在我使用 StackTrace 的代码中发生了一些奇怪的事情。几乎就像没有加载调试信息一样......但我正在 DEBUG 构建上运行它。.pdb 文件肯定在 bin 目录中并且是最新的。我的想法真的
我不断收到此错误,我似乎在网上找不到任何帮助。我是flutter和android studio的新手。非常感谢任何帮助 FAILURE:构建失败并出现异常。 Where: Build file 'C:
在我的项目的目标目录中,有一个名为 stacktrace.log 的文件。我已经意识到文件的大小已经超过 3 GB。删除这个文件对我来说安全吗?删除后是否会导致任何文件未找到异常?谢谢你的时间。 -
我知道 http://richhickey.github.com/clojure/clojure.stacktrace-api.html . 有没有办法在不抛出异常并捕获它的情况下获取当前的堆栈跟踪?
我有一个异常记录器,它将所有异常记录到日志文件中: class function TLogger.LogException (ACaller: String; E: Exception): Boole
有时我在jQuery UI js文件的一行中收到错误或未处理的异常。我知道问题是一个空或空的对象或属性传递给jQuery。例如,在Chrome浏览器中,我收到“未捕获的TypeError”错误。 做一
我只是通过使用全局函数(在我的情况下称为GetCallingMethod)进行了一些分析。 通常情况下,它的效果很好。但是在某些情况下,应用程序被阻止。当关闭应用程序时,它被阻止。在Visual St
我正在分析遗留应用程序中的错误,同时清理并改进它。我有一些堆栈跟踪被记录到数据库中,但是它存储的量有一个限制 (VARCHAR2(1000)),并且错误发生在 System.Data 的深处.....
我是一名优秀的程序员,十分优秀!