大约代码如下:
#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;
...
如何检查我是否没有仔细检查指针,或只是访问未初始化的数据并遵循它?
我知道这是可能的,因为调试器可以知道程序试图访问的地址。
答案 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())) {
}