【发布时间】:2016-05-13 12:37:41
【问题描述】:
代码大概是这样的:
#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;
...
如何检查我是否没有仔细检查指针,或者只是访问了未初始化的数据并尊重它?
我知道这是可能的,因为调试器可以知道程序试图访问哪个地址。
【问题讨论】:
-
我不认为调试器是这样工作的。
-
@Boiethios 调试器通过覆盖信号然后植入错误指令来创建断点(?)
-
也许你可以改用
sigaction? -
调试器知道这一点,因为他们分析进程内存(从崩溃时的调用堆栈和寄存器内容开始)。如果您希望您的软件也能够做到这一点,您只需在其中嵌入一个调试器。换句话说:如果你可以只运行一个调试器,为什么还要麻烦?
-
如果您只需要在 Windows 上使用它,您可以使用结构化异常处理程序。你会得到一个包含详细信息的 EXCEPTION_RECORD 和 CONTEXT 结构。
标签: c++ windows segmentation-fault signals