mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix my_safe_kill's create crashdump functionality on Windows.
If pid belongs to my_safe_process.exe, create crashdump of my_safe_process's child, because my_safe_process is only used to start other programs.
This commit is contained in:
@ -26,7 +26,30 @@
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <psapi.h>
|
||||
#include <DbgHelp.h>
|
||||
#include <dbghelp.h>
|
||||
#include <tlhelp32.h>
|
||||
|
||||
static DWORD find_child(DWORD pid)
|
||||
{
|
||||
HANDLE h= NULL;
|
||||
PROCESSENTRY32 pe={ 0 };
|
||||
DWORD child_pid = 0;
|
||||
pe.dwSize = sizeof(PROCESSENTRY32);
|
||||
h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if(h == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
for (BOOL ret = Process32First(h, &pe); ret; ret = Process32Next(h, &pe))
|
||||
{
|
||||
if (pe.th32ParentProcessID == pid)
|
||||
{
|
||||
child_pid = pe.th32ProcessID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
CloseHandle(h);
|
||||
return (child_pid);
|
||||
}
|
||||
|
||||
static int create_dump(DWORD pid)
|
||||
{
|
||||
@ -37,6 +60,8 @@ static int create_dump(DWORD pid)
|
||||
HANDLE file= INVALID_HANDLE_VALUE;
|
||||
char *p;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
process= OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)pid);
|
||||
if (!process)
|
||||
{
|
||||
@ -52,6 +77,27 @@ static int create_dump(DWORD pid)
|
||||
pid, GetLastError());
|
||||
goto exit;
|
||||
}
|
||||
const char *filename= strrchr(path, '\\');
|
||||
if (filename)
|
||||
{
|
||||
filename++;
|
||||
// We are not interested in my_safe_process.exe,
|
||||
// since it is only used to start up other programs.
|
||||
// We're interested however in my_safe_processes' child.
|
||||
if (strcmp(filename, "my_safe_process.exe") == 0)
|
||||
{
|
||||
pid= find_child(pid);
|
||||
if (!pid)
|
||||
{
|
||||
fprintf(stderr,"safe_kill : can't find child process for safe_process.exe\n");
|
||||
goto exit;
|
||||
}
|
||||
CloseHandle(process);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((p= strrchr(path, '.')) == 0)
|
||||
p= path + strlen(path);
|
||||
@ -100,6 +146,7 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, const char** argv )
|
||||
{
|
||||
DWORD pid= -1;
|
||||
|
Reference in New Issue
Block a user