SigSeSv信号处理程序不从二级线程C++窗口调用
在下面的简单测试代码中,SIGSEGV信号处理程序不是从辅助线程调用的,尽管如果崩溃发生在主线程中,则会调用它。在这两种情况下都会调用SIGABRT信号的处理程序。 谁能解释一下我做错了什么或为什么SigSeSv信号处理程序不从二级线程C++窗口调用,c++,multithreading,C++,Multithreading,在下面的简单测试代码中,SIGSEGV信号处理程序不是从辅助线程调用的,尽管如果崩溃发生在主线程中,则会调用它。在这两种情况下都会调用SIGABRT信号的处理程序。 谁能解释一下我做错了什么或为什么 #include <iostream> #include <Windows.h> #include <signal.h> void signal_handler(int sig) { const char* name = NULL; switc
#include <iostream>
#include <Windows.h>
#include <signal.h>
void signal_handler(int sig)
{
const char* name = NULL;
switch( sig )
{
case SIGABRT: name = "SIGABRT"; break;
case SIGSEGV: name = "SIGSEGV"; break;
}
std::cout << "Handler: Caught signal: " << name << std::endl;
}
void install_signal_handlers()
{
signal(SIGABRT, signal_handler);
signal(SIGSEGV, signal_handler);
std::cout << "Signal handlers are installed" << std::endl;
}
void crash()
{
//abort();
//raise(SIGSEGV);
try
{
int* ptr = NULL;
*ptr = 2;
std::cout << *ptr << std::endl;
}
catch (...)
{
std::cout << "Caught exception: " << std::endl;
}
}
DWORD WINAPI thread(LPVOID lpParameter)
{
//install_signal_handlers();
crash();
return 0;
}
int main()
{
install_signal_handlers();
//crash();
DWORD myThreadID;
HANDLE myHandle = CreateThread(0, 0, thread, 0, 0, &myThreadID);
if (myHandle == NULL)
{
std::cout << "Failed to create thread" << std::endl;
}
WaitForSingleObject(myHandle, INFINITE);
CloseHandle(myHandle);
return 0;
}
看起来Windows不符合POSIX,是吗?一些可能无关的注意事项:写入空指针不一定会导致崩溃,很可能会,但未定义行为的问题是,该行为只是未定义的,任何事情都可能发生。它也不会导致C++异常被抛出。至于你的问题,什么次要线程?在POSIX中,如果在Windows中是相同的,我不知道哪个线程会收到信号,这是没有保证的。谢谢,但我的问题有点不同。如果取消注释main函数中的第2行并调用crash函数,则信号处理程序将始终使用信号SIGSEGV进行调用。但在函数“thread”中,调用相同崩溃函数的非主线程不会调用信号处理程序。重新写入空指针并不一定会导致崩溃——我尝试直接提高sesigsegv以确保问题仍然存在。