mirror of https://github.com/AxioDL/logvisor.git
Add KillProcessTree subroutine
This commit is contained in:
parent
beee8b3970
commit
f28fa0dbb2
|
@ -53,6 +53,13 @@ struct ILogger
|
||||||
const wchar_t* format, va_list ap)=0;
|
const wchar_t* format, va_list ap)=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Terminate all child processes
|
||||||
|
*
|
||||||
|
* Implicitly called on abort condition.
|
||||||
|
*/
|
||||||
|
void KillProcessTree();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Assign calling thread a descriptive name
|
* @brief Assign calling thread a descriptive name
|
||||||
* @param name Descriptive thread name
|
* @param name Descriptive thread name
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#endif
|
#endif
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
|
#include <DbgHelp.h>
|
||||||
|
#include <TlHelp32.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -79,7 +81,6 @@ void RegisterThreadName(const char* name)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
#include <DbgHelp.h>
|
|
||||||
#pragma comment(lib, "Dbghelp.lib")
|
#pragma comment(lib, "Dbghelp.lib")
|
||||||
|
|
||||||
#if defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
|
#if defined(WINAPI_FAMILY) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
|
||||||
|
@ -88,6 +89,38 @@ void RegisterThreadName(const char* name)
|
||||||
#define WINDOWS_STORE 0
|
#define WINDOWS_STORE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void KillProcessTree()
|
||||||
|
{
|
||||||
|
DWORD myprocID = GetCurrentProcessId();
|
||||||
|
PROCESSENTRY32 pe = {};
|
||||||
|
pe.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
|
||||||
|
HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||||
|
|
||||||
|
if (::Process32First(hSnap, &pe))
|
||||||
|
{
|
||||||
|
BOOL bContinue = TRUE;
|
||||||
|
|
||||||
|
// kill child processes
|
||||||
|
while (bContinue)
|
||||||
|
{
|
||||||
|
// only kill child processes
|
||||||
|
if (pe.th32ParentProcessID == myprocID)
|
||||||
|
{
|
||||||
|
HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
|
||||||
|
|
||||||
|
if (hChildProc)
|
||||||
|
{
|
||||||
|
::TerminateProcess(hChildProc, 1);
|
||||||
|
::CloseHandle(hChildProc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bContinue = ::Process32Next(hSnap, &pe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void logvisorAbort()
|
void logvisorAbort()
|
||||||
{
|
{
|
||||||
#if !WINDOWS_STORE
|
#if !WINDOWS_STORE
|
||||||
|
@ -130,6 +163,9 @@ void logvisorAbort()
|
||||||
free(symbol);
|
free(symbol);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KillProcessTree();
|
||||||
|
|
||||||
// If you caught one of the above signals, it is likely you just
|
// If you caught one of the above signals, it is likely you just
|
||||||
// want to quit your program right now.
|
// want to quit your program right now.
|
||||||
signal(SIGABRT, SIG_DFL);
|
signal(SIGABRT, SIG_DFL);
|
||||||
|
@ -137,6 +173,8 @@ void logvisorAbort()
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
void KillProcessTree() {}
|
||||||
|
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
void logvisorAbort()
|
void logvisorAbort()
|
||||||
{
|
{
|
||||||
|
@ -204,6 +242,7 @@ void logvisorAbort()
|
||||||
|
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
KillProcessTree();
|
||||||
signal(SIGABRT, SIG_DFL);
|
signal(SIGABRT, SIG_DFL);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
@ -420,6 +459,7 @@ struct ConsoleLogger : public ILogger
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfprintf(stderr, format, ap);
|
vfprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
|
@ -428,6 +468,7 @@ struct ConsoleLogger : public ILogger
|
||||||
_reportHead(modName, nullptr, severity);
|
_reportHead(modName, nullptr, severity);
|
||||||
vfwprintf(stderr, format, ap);
|
vfwprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reportSource(const char* modName, Level severity,
|
void reportSource(const char* modName, Level severity,
|
||||||
|
@ -439,6 +480,7 @@ struct ConsoleLogger : public ILogger
|
||||||
_reportHead(modName, sourceInfo, severity);
|
_reportHead(modName, sourceInfo, severity);
|
||||||
vfprintf(stderr, format, ap);
|
vfprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reportSource(const char* modName, Level severity,
|
void reportSource(const char* modName, Level severity,
|
||||||
|
@ -450,6 +492,7 @@ struct ConsoleLogger : public ILogger
|
||||||
_reportHead(modName, sourceInfo, severity);
|
_reportHead(modName, sourceInfo, severity);
|
||||||
vfwprintf(stderr, format, ap);
|
vfwprintf(stderr, format, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue