有没有办法获得在处理信号期间访问的指针?

时间:2016-05-13 12:37:41

标签: c++ windows segmentation-fault signals

大约代码如下:

#include <signal.h>

void SegmentationFaultHandler( int signal ) {
    if ( signal == SIGSEGV ) {
        // how to check here if it's actual null pointer?
        Throw( NullPointerException, "Object pointer not set to an instance of an object." );
    }
    else
        Throw( InvalidOperationException, "Signal has been intercepted by wrong function." );
}

int main( ) {
    signal( SIGSEGV, SegmentationFaultHandler );
    try {
        int *i = null;
        *i = 0;
...

如何检查我是否没有仔细检查指针,或只是访问未初始化的数据并遵循它?

我知道这是可能的,因为调试器可以知道程序试图访问的地址。

1 个答案:

答案 0 :(得分:1)

看来您可以使用在signal.h中声明的_pxcptinfoptrs全局变量检索处理程序内的PEXCEPTION_POINTERS。然后使用此指针,如下例所示。

static void sigsegv_handler(int signo)
{
    PEXCEPTION_POINTERS excptr = _pxcptinfoptrs;
    if (excptr != NULL) {

    }
    // ...
}

向量异常处理程序

在Windows下,您可以使用Vectored Exception Handler。您的处理程序将如下所示:

LONG WINAPI ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionPointers ) {

然后:

pExceptionPointers->ExceptionRecord->ExceptionCode

是异常代码,EXCEPTION_ACCESS_VIOLATION是访问无效内存时。

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 0
读取操作完成时

为真

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 1

用于写操作

pExceptionPointers->ExceptionRecord->ExceptionInformation[1]

是发生异常时正在读/写的地址

结构化异常过滤

如果你不能使用向量异常处理程序,那么除了代码的最低级别,你可以添加__try / __,即。在main()中或者你正在执行线程函数的地方:

 __try {
    // Code which might cause access violation or any other hardware exceptions
 } 
 __except(ExceptionFilter(GetExceptionInformation())) {
 }