是否有Java的c ++等价物
try {
...
}
catch (Throwable t) {
...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试调试调用本机Windows函数的Java/jni代码,并且虚拟机不断崩溃.本机代码在单元测试中看起来很好,并且在通过jni调用时似乎只会崩溃.一般的异常捕获机制将证明是非常有用的.
我有一个Linux C++应用程序,我想在解除引用之前测试对象指针的有效性.但是,由于分段错误,try/catch在Linux上不起作用.如何才能做到这一点?
在Linux上分析崩溃的最佳方法是什么?
我们希望构建软件并向测试人员提供发布版本.测试人员可能无法记住如何重现崩溃或崩溃可能完全断断续续.他们的机器上也没有开发环境.该软件使用C/C++编写,并编译为本机代码以进行分发.
我正在Visual Studio 2019上编写控制台C ++程序,其中使用了第三方相机库。这个lib需要我在程序的开始处调用libInitialize()并在程序结束时调用libTerminate()。如果我不调用libTerminate(),则下次启动该程序时,我将收到一条错误消息,指出该相机仍在被其他程序使用。只要我正确退出程序,一切都很好。但是,如果我通过关闭控制台窗口或按调试器中的停止按钮来终止程序,则永远不会调用libTerminate()。所以我的问题是,每当程序意外终止时,是否有任何方法可以执行代码?
(环境:Linux 3.0 / x86_64 上 -std=gnu++0x 模式下的 gcc/g++ 4.6.1...)
#include <stdlib.h>
#include <signal.h>
#include <iostream>
using namespace std;
class SegmentationFault {};
void ThrowSegmentationFault(int)
{
throw SegmentationFault();
}
void ohno(char* x)
{
*x = 42;
}
int main()
{
signal(SIGSEGV, ThrowSegmentationFault);
try
{
ohno(0);
}
catch (const SegmentationFault&)
{
cout << "success" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用-fnon-call-exceptions标志编译上面的代码,它允许SIGSEGV信号处理程序抛出异常,并且在运行时它将打印“成功”。-fnon-call-exceptions gcc 标志的文档如下:
生成允许捕获指令抛出异常的代码。请注意,这需要特定于平台的运行时支持,但并非所有地方都存在。此外,它只允许捕获指令抛出异常,即内存引用或浮点指令。它不允许从任意信号处理程序(例如 SIGALRM)引发异常。
我的问题是哪些信号正在捕获指令,哪些信号不是?
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5 …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用外部动态库的.NET 4.5控制台应用程序,但我无权访问这些库的源代码。问题是这些 DLL 可能会引发分段错误信号,当这种情况发生时,整个进程会立即终止。我当前的解决方案是将这个依赖于 dll 的代码作为单独的进程运行,然后检索结果,但我注意到这个解决方案效率不是很高。
为了说明我的问题,我制作了一个示例代码:
#include <signal.h>
__declspec(dllexport) void err(void)
{
raise(SIGSEGV);
}
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Runtime.InteropServices;
namespace ConsoleApp
{
class Program
{
[DllImport("segFault.dll")]
extern static void err();
static void Main(string[] args)
{
try
{
Console.Write("started");
err();
Console.WriteLine("running");
}
catch(Exception ex)
{
Console.WriteLine("Exception:" + ex.Message);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过这样的设置,我永远不会到达“正在运行”或“异常:”代码,因为整个过程将在到达段错误信号时终止。我尝试过扰乱应用程序域,但也没有取得任何巨大的成功。
using System;
using System.Linq;
using System.Runtime.InteropServices;
namespace ConsoleApp
{
class Program
{
[DllImport("segFault.dll")]
extern static void err();
static void Main(string[] args)
{
if …Run Code Online (Sandbox Code Playgroud) 最近在我的一个程序中,我遇到了分段错误问题。我设法找到引起问题的线,但没有找到解决它的方法。
该行:
self.window_player.add(self.vlc)
Run Code Online (Sandbox Code Playgroud)
在哪里self.vlc是一个小部件,self.window_player是Gtk.Window()在林间空地中创建的空。
该行位于__init__我的程序的,因此实际上此问题仅在启动该程序时发生。奇怪的事实是,错误仅显示为(启动程序的)10次中的1次
错误:这
Segmentation fault是我从终端获得的唯一输出
所以我尝试了:
while True:
try:
self.window_player.add(self.vlc)
break
except:
print "segmentation"
Run Code Online (Sandbox Code Playgroud)
问题是分割错误似乎并没有被try!排除。
在C++中,如果我希望代码调用一些不好的事情,我可以将代码放在析构函数或try-catch中.
在C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?
我有一些生产关键代码必须继续运行。
将代码视为
while (true){
init();
do_important_things(); //segfault here
clean();
}
Run Code Online (Sandbox Code Playgroud)
我不能相信代码没有错误,并且我需要能够记录问题以便稍后进行调查。
这次,我知道代码中的某个地方抛出了分段错误,我需要至少能够记录该错误,然后重新开始一切。
阅读这里有一些解决方案,但每个解决方案后面都是一场激烈的争论,声称该解决方案实际上弊大于利,没有真正的解释。我还找到了我考虑使用的这个答案,但我不确定它是否适合我的用例。
那么,从 C++ 分段错误中恢复的最佳方法是什么?
我正在使用外部库(xqilla)来实现c ++,它以某些uri的分段错误结束,有些则不然.我对整个C世界都有点新意,我猜我不可能把它当成例外,但是我需要问一下它是否可能.任何其他解决方案当然也会受到欢迎.
那么有没有替代尝试捕获"分段错误"错误?