Added option "--thread" which will perform the crashing operation in
another thread. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22423 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
99454e4a90
commit
b2537f99cd
@ -14,6 +14,7 @@ static const char *kUsage =
|
|||||||
"\n"
|
"\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -h, --help - print this info text\n"
|
" -h, --help - print this info text\n"
|
||||||
|
" --thread - crash in a separate thread\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Modes:\n"
|
"Modes:\n"
|
||||||
"[general]\n"
|
"[general]\n"
|
||||||
@ -45,18 +46,19 @@ print_usage_and_exit(bool error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static int
|
||||||
crash_segv()
|
crash_segv()
|
||||||
{
|
{
|
||||||
int *a = 0;
|
int *a = 0;
|
||||||
*a = 0;
|
*a = 0;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
crash_segv2()
|
crash_segv2()
|
||||||
{
|
{
|
||||||
const char *str = (const char*)0x1;
|
const char *str = (const char*)0x1;
|
||||||
strcmp(str, "Test");
|
return strcmp(str, "Test");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -67,33 +69,72 @@ crash_div()
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
crash_debugger()
|
crash_debugger()
|
||||||
{
|
{
|
||||||
debugger("crashing_app() invoked debugger()");
|
debugger("crashing_app() invoked debugger()");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __INTEL__
|
#if __INTEL__
|
||||||
|
|
||||||
static void
|
static int
|
||||||
crash_int3()
|
crash_int3()
|
||||||
{
|
{
|
||||||
asm("int3");
|
asm("int3");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
crash_protection()
|
crash_protection()
|
||||||
{
|
{
|
||||||
asm("movl %0, %%dr7" : : "r"(0));
|
asm("movl %0, %%dr7" : : "r"(0));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __INTEL__
|
#endif // __INTEL__
|
||||||
|
|
||||||
|
|
||||||
int
|
typedef int crash_function_t();
|
||||||
main(int argc, const char *const *argv)
|
|
||||||
|
|
||||||
|
static crash_function_t*
|
||||||
|
get_crash_function(const char* mode)
|
||||||
{
|
{
|
||||||
const char *mode = "segv";
|
if (strcmp(mode, "segv") == 0) {
|
||||||
|
return crash_segv;
|
||||||
|
} else if (strcmp(mode, "segv2") == 0) {
|
||||||
|
return crash_segv2;
|
||||||
|
} else if (strcmp(mode, "div") == 0) {
|
||||||
|
return (crash_function_t*)crash_div;
|
||||||
|
} else if (strcmp(mode, "debugger") == 0) {
|
||||||
|
return crash_debugger;
|
||||||
|
#if __INTEL__
|
||||||
|
} else if (strcmp(mode, "int3") == 0) {
|
||||||
|
return crash_int3;
|
||||||
|
} else if (strcmp(mode, "protection") == 0) {
|
||||||
|
return crash_protection;
|
||||||
|
#endif // __INTEL__
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
crashing_thread(void* data)
|
||||||
|
{
|
||||||
|
crash_function_t* doCrash = (crash_function_t*)data;
|
||||||
|
snooze(100000);
|
||||||
|
doCrash();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char* const* argv)
|
||||||
|
{
|
||||||
|
bool inThread = false;
|
||||||
|
const char* mode = "segv";
|
||||||
|
|
||||||
// parse args
|
// parse args
|
||||||
int argi = 1;
|
int argi = 1;
|
||||||
@ -103,6 +144,8 @@ main(int argc, const char *const *argv)
|
|||||||
if (arg[0] == '-') {
|
if (arg[0] == '-') {
|
||||||
if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) {
|
if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) {
|
||||||
print_usage_and_exit(false);
|
print_usage_and_exit(false);
|
||||||
|
} else if (strcmp(arg, "--thread") == 0) {
|
||||||
|
inThread = true;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Invalid option \"%s\"\n", arg);
|
fprintf(stderr, "Invalid option \"%s\"\n", arg);
|
||||||
print_usage_and_exit(true);
|
print_usage_and_exit(true);
|
||||||
@ -112,24 +155,28 @@ main(int argc, const char *const *argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(mode, "segv") == 0) {
|
crash_function_t* doCrash = get_crash_function(mode);
|
||||||
crash_segv();
|
if (doCrash == NULL) {
|
||||||
} else if (strcmp(mode, "segv2") == 0) {
|
|
||||||
crash_segv2();
|
|
||||||
} else if (strcmp(mode, "div") == 0) {
|
|
||||||
crash_div();
|
|
||||||
} else if (strcmp(mode, "debugger") == 0) {
|
|
||||||
crash_debugger();
|
|
||||||
#if __INTEL__
|
|
||||||
} else if (strcmp(mode, "int3") == 0) {
|
|
||||||
crash_int3();
|
|
||||||
} else if (strcmp(mode, "protection") == 0) {
|
|
||||||
crash_protection();
|
|
||||||
#endif // __INTEL__
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Invalid mode \"%s\"\n", mode);
|
fprintf(stderr, "Invalid mode \"%s\"\n", mode);
|
||||||
print_usage_and_exit(true);
|
print_usage_and_exit(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inThread) {
|
||||||
|
thread_id thread = spawn_thread(crashing_thread, "crashing thread",
|
||||||
|
B_NORMAL_PRIORITY, (void*)doCrash);
|
||||||
|
if (thread < 0) {
|
||||||
|
fprintf(stderr, "Error: Failed to spawn thread: %s\n",
|
||||||
|
strerror(thread));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
resume_thread(thread);
|
||||||
|
status_t result;
|
||||||
|
while (wait_for_thread(thread, &result) == B_INTERRUPTED) {
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
doCrash();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user