Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有方法获取在处理信号期间访问的指针?_C++_Windows_Segmentation Fault_Signals - Fatal编程技术网

C++ 是否有方法获取在处理信号期间访问的指针?

C++ 是否有方法获取在处理信号期间访问的指针?,c++,windows,segmentation-fault,signals,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 a

代码大致如下:

#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;
...
#包括
无效分段FaultHandler(int信号){
如果(信号==SIGSEGV){
//如何在这里检查它是否是实际的空指针?
抛出(NullPointerException,“对象指针未设置为对象的实例”);
}
其他的
抛出(InvalidOperationException,“信号被错误函数截获”);
}
int main(){
信号(SIGSEGV,SegmentationFaultHandler);
试一试{
int*i=null;
*i=0;
...
如何检查我是否没有双重检查指针,或者只是访问了未初始化的数据并遵从它


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

似乎可以使用signal.h中声明的_pxcptinfoptrs全局变量在处理程序中检索PEXCEPTION_指针。然后使用此指针,如下面的示例所示

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

    }
    // ...
}
向量化异常处理程序

在windows下,您可以使用。处理程序如下所示:

LONG WINAPI ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionPointers ) {
然后:

是您的异常代码,当您访问无效内存时,会出现异常访问冲突

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 0
在执行读取操作时为true

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())) {
 }

我不认为调试器是这样工作的。@Boiethios调试器通过覆盖信号然后植入错误指令来创建断点(?)也许你可以使用
sigaction
?调试器知道这一点,因为它们分析进程内存(从调用堆栈开始,并在崩溃时注册内容)。如果你想让你的软件也能做到这一点,你只需要在其中嵌入一个调试器。换句话说,如果你能运行一个调试器,为什么还要麻烦呢?如果你只在windows上需要它,你可以使用结构化的异常处理程序。你会得到一个异常记录和上下文结构以及详细信息。我无法设置\uuu重试除此之外,我必须让它抛出适当的异常。不管怎样,我找到了一种方法,就像信号处理程序一样。你可以用
addvectoredceptionhandler(0,…)
@LyingOnTheSky来做。我刚刚更新了答案,见顶部-但老实说,我从来没有用过pxcptinfoptrs。别介意,我漏了一行。(答案从一开始就没问题)
 __try {
    // Code which might cause access violation or any other hardware exceptions
 } 
 __except(ExceptionFilter(GetExceptionInformation())) {
 }