在C++中捕获Segfault或任何其他错误/异常/信号,就像在Java中捕获异常一样。

13 浏览
0 Comments

在C++中捕获Segfault或任何其他错误/异常/信号,就像在Java中捕获异常一样。

我基于一个有缺陷的开源库编写了一个Linux程序。这个库有时会触发我无法控制的段错误。当然,一旦库有段错误,整个程序就会崩溃。然而,我必须确保即使库有段错误,我的程序仍然可以继续运行。这是因为我的程序有点像一个“服务器”,它至少需要告诉客户端发生了一些错误,并从错误中恢复,而不是退缩... 有没有办法做到这一点?\n我知道在Java中,只需要捕获异常。但是C++如何处理这个问题?\n[更新]我知道C++也有异常处理,但是段错误不是一个异常,对吗?我认为在发生段错误时不会抛出任何东西。据我所知,你必须显式地“抛出”一些东西才能使用try...catch...。非常感谢,我对C++还很新。

0
0 Comments

你可以使用信号处理程序。不过,这并不是推荐的做法,因为你无法保证已经消除了问题的根源。最好的方法是将其隔离到一个单独的进程中,这是Google Chrome采用的方法。

如果它是开源的,最简单的方法就是进行调试。

0
0 Comments

在C++中,无法像在Java中捕获异常一样捕获错误/异常/信号,比如捕获SIGSEGV。这个问题的出现是因为出现了导致SIGSEGV的错误代码,通常会触发未定义的行为,比如解引用空指针或读取垃圾内存。如果代码操作无效数据,那么程序无法继续执行。虽然可以处理信号,但最多只能打印堆栈跟踪信息并终止程序。C和C++本质上是不安全的,无法处理由未定义行为触发的错误,并让程序继续执行。

解决这个问题的方法是使用try-catch块来捕获异常。在C++中,可以使用try-catch块来捕获一些特定的异常,比如std::exception。然而,对于触发SIGSEGV的错误,无法通过try-catch块来捕获。因此,无法使用相同的方式在C++中捕获异常,就像在Java中捕获异常一样。

为了解决这个问题,可以使用信号处理函数来捕获SIGSEGV信号。可以使用头文件中的signal()函数来注册信号处理函数。当程序触发SIGSEGV信号时,信号处理函数将被调用。

下面是一个示例代码,演示如何通过信号处理函数来捕获SIGSEGV信号:

#include

#include

void sigsegvHandler(int signal)

{

std::cout << "Caught SIGSEGV signal" << std::endl;

// Perform necessary actions here

// ...

// Terminate the program if necessary

exit(signal);

}

int main()

{

// Register SIGSEGV signal handler

signal(SIGSEGV, sigsegvHandler);

// Perform some buggy code that may trigger SIGSEGV

int* ptr = nullptr;

*ptr = 10;

return 0;

}

在上面的代码中,我们定义了一个名为sigsegvHandler()的信号处理函数,当捕获到SIGSEGV信号时,该函数将被调用。在main()函数中,我们使用signal()函数将sigsegvHandler()函数注册为SIGSEGV信号的处理函数。

当程序执行到*ptr = 10;这行代码时,由于ptr是一个空指针,触发了SIGSEGV信号。此时,信号处理函数sigsegvHandler()将被调用,并输出"Caught SIGSEGV signal"。

通过使用信号处理函数,我们可以捕获并处理SIGSEGV信号,从而在某种程度上模拟在C++中捕获异常的行为。但是需要注意的是,这种方式仅适用于处理SIGSEGV信号,对于其他错误、异常或信号,仍然无法通过类似的方式在C++中捕获和处理。

0
0 Comments

无法可靠地在分段错误后恢复执行。如果您的程序必须继续运行,请将有问题的库隔离在一个单独的进程中,并通过管道与其通信。当它发生分段错误时,您的程序将注意到管道关闭。

链接提供的信息已经失效了,您能再找到一下这个信息吗?

0