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