summaryrefslogtreecommitdiff
path: root/mysql-test/lib
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-09-24 17:32:50 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-09-24 17:32:50 +0300
commit83c4523f0378ec37986501104d55b0258e6ac9f2 (patch)
treecc750751e3c73e4b77b784c25d8ad3e8b43029fc /mysql-test/lib
parent88f38661b75e68ed255491ed51e52e73cfe06011 (diff)
parent69bd2c88e17df2aa6c0edce5196e70976129dfab (diff)
downloadmariadb-git-83c4523f0378ec37986501104d55b0258e6ac9f2.tar.gz
Merge 10.4 into 10.5
Diffstat (limited to 'mysql-test/lib')
-rw-r--r--mysql-test/lib/My/SafeProcess/CMakeLists.txt3
-rw-r--r--mysql-test/lib/My/SafeProcess/safe_kill_win.cc109
2 files changed, 4 insertions, 108 deletions
diff --git a/mysql-test/lib/My/SafeProcess/CMakeLists.txt b/mysql-test/lib/My/SafeProcess/CMakeLists.txt
index eac1f1be8bd..0004a44982d 100644
--- a/mysql-test/lib/My/SafeProcess/CMakeLists.txt
+++ b/mysql-test/lib/My/SafeProcess/CMakeLists.txt
@@ -19,7 +19,8 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
IF (WIN32)
ADD_EXECUTABLE(my_safe_process safe_process_win.cc)
ADD_EXECUTABLE(my_safe_kill safe_kill_win.cc)
- TARGET_LINK_LIBRARIES(my_safe_kill dbghelp psapi)
+ TARGET_INCLUDE_DIRECTORIES(my_safe_kill PRIVATE ${CMAKE_SOURCE_DIR}/include)
+ TARGET_LINK_LIBRARIES(my_safe_kill mysys psapi)
ELSE()
ADD_EXECUTABLE(my_safe_process safe_process.cc)
ENDIF()
diff --git a/mysql-test/lib/My/SafeProcess/safe_kill_win.cc b/mysql-test/lib/My/SafeProcess/safe_kill_win.cc
index 4a9d5f2b8cc..375ed80b292 100644
--- a/mysql-test/lib/My/SafeProcess/safe_kill_win.cc
+++ b/mysql-test/lib/My/SafeProcess/safe_kill_win.cc
@@ -26,19 +26,7 @@
#include <signal.h>
#include <stdlib.h>
#include <psapi.h>
-
-#ifdef _MSC_VER
-/* Silence warning in OS header dbghelp.h */
-#pragma warning(push)
-#pragma warning(disable : 4091)
-#endif
-
-#include <dbghelp.h>
-
-#ifdef _MSC_VER
-/* Silence warning in OS header dbghelp.h */
-#pragma warning(pop)
-#endif
+#include <my_minidump.h>
#include <tlhelp32.h>
#include <vector>
@@ -64,106 +52,13 @@ static std::vector<DWORD> find_children(DWORD pid)
return children;
}
-void dump_single_process(DWORD pid)
-{
- HANDLE file = 0;
- HANDLE process= 0;
- DWORD size= MAX_PATH;
- char path[MAX_PATH];
- char working_dir[MAX_PATH];
- char tmpname[MAX_PATH];
- char *filename= 0;
-
- process= OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
- if (!process)
- {
- fprintf(stderr, "safe_kill : cannot open process pid=%lu to create dump, last error %lu\n",
- pid, GetLastError());
- goto exit;
- }
-
- if (QueryFullProcessImageName(process, 0, path, &size) == 0)
- {
- fprintf(stderr, "safe_kill : cannot read process path for pid %lu, last error %lu\n",
- pid, GetLastError());
- goto exit;
- }
-
- filename= strrchr(path, '\\');
- if (filename)
- {
- filename++;
- // We are not interested in dump of some proceses (my_safe_process.exe,cmd.exe)
- // since they are only used to start up other programs.
- // We're interested however in their children;
- const char *exclude_programs[] = {"my_safe_process.exe","cmd.exe", 0};
- for(size_t i=0; exclude_programs[i]; i++)
- if (_stricmp(filename, exclude_programs[i]) == 0)
- goto exit;
- }
- else
- filename= path;
-
- // Add .dmp extension
- char *p;
- if ((p= strrchr(filename, '.')) == 0)
- p= filename + strlen(filename);
-
- strncpy(p, ".dmp", path + MAX_PATH - p);
-
- // Íf file with this name exist, generate unique name with .dmp extension
- if (GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES)
- {
- if (!GetTempFileName(".", filename, 0, tmpname))
- {
- fprintf(stderr, "GetTempFileName failed, last error %lu", GetLastError());
- goto exit;
- }
- strncat_s(tmpname, ".dmp", sizeof(tmpname));
- filename= tmpname;
- }
-
-
- if (!GetCurrentDirectory(MAX_PATH, working_dir))
- {
- fprintf(stderr, "GetCurrentDirectory failed, last error %lu", GetLastError());
- goto exit;
- }
-
- file= CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
- 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
-
- if (file == INVALID_HANDLE_VALUE)
- {
- fprintf(stderr, "safe_kill : CreateFile() failed for file %s, working dir %s, last error = %lu\n",
- filename, working_dir, GetLastError());
- goto exit;
- }
-
- if (!MiniDumpWriteDump(process, pid, file, MiniDumpNormal, 0, 0, 0))
- {
- fprintf(stderr, "Failed to write minidump to %s, working dir %s, last error %lu\n",
- filename, working_dir, GetLastError());
- goto exit;
- }
-
- fprintf(stderr, "Minidump written to %s, directory %s\n", filename, working_dir);
-
-exit:
- if (process != 0 && process != INVALID_HANDLE_VALUE)
- CloseHandle(process);
-
- if (file != 0 && file != INVALID_HANDLE_VALUE)
- CloseHandle(file);
-}
-
static int create_dump(DWORD pid, int recursion_depth= 5)
{
if (recursion_depth < 0)
return 0;
- dump_single_process(pid);
+ my_create_minidump(pid, TRUE);
std::vector<DWORD> children= find_children(pid);
for(size_t i=0; i < children.size(); i++)
create_dump(children[i], recursion_depth -1);