diff --git a/bin/libbreakgen.so b/bin/libbreakgen.so index 3144625a0645..938db35440b7 100644 Binary files a/bin/libbreakgen.so and b/bin/libbreakgen.so differ diff --git a/tools/DumpThreads/AppMain.c b/tools/DumpThreads/AppMain.c new file mode 100644 index 000000000000..ee55c00124b4 --- /dev/null +++ b/tools/DumpThreads/AppMain.c @@ -0,0 +1,59 @@ + +#if defined(WIN32) +#include +#else +#include +#include +#include +#include +#include +#include + +int isKernel26OrHigher(); +#endif + +JNIEXPORT void JNICALL Java_com_intellij_rt_execution_application_AppMain_triggerControlBreak + (JNIEnv *env, jclass clazz) { +#if defined(WIN32) + GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0); +#else + if (isKernel26OrHigher()) { + kill (getpid(), SIGQUIT); + } else { + int ppid = getppid(); + char buffer[1024]; + sprintf(buffer, "/proc/%d/status", ppid); + FILE * fp; + if ( (fp = fopen(buffer, "r")) != NULL ) + { + char s[124]; + char * ppid_name = "PPid:"; + while (fscanf (fp, "%s\n", s) > 0) { + if (strcmp(s, ppid_name) == 0) { + int pppid; + fscanf(fp, "%d", &pppid); + kill (pppid, SIGQUIT); + break; + } + } + + fclose (fp); + } + } +#endif +} + + +int isKernel26OrHigher() { + char buffer[1024]; + FILE * fp; + if ( (fp = fopen("/proc/version", "r")) != NULL ) + { + int major; + int minor; + fscanf(fp, "Linux version %d.%d", &major, &minor); + return major >=2 && minor >= 6; + } + + return 0; +}