int main(int argc, char** argv) { int retv = 0; HANDLE hFile = INVALID_HANDLE_VALUE; enum dbg_start ds; #ifdef __i386__ be_cpu = &be_i386; #elif defined(__powerpc__) be_cpu = &be_ppc; #elif defined(__ALPHA__) be_cpu = &be_alpha; #elif defined(__x86_64__) be_cpu = &be_x86_64; #elif defined(__sparc__) be_cpu = &be_sparc; #elif defined(__arm__) be_cpu = &be_arm; #else # error CPU unknown #endif /* Initialize the output */ dbg_houtput = GetStdHandle(STD_OUTPUT_HANDLE); /* Initialize internal vars */ if (!dbg_load_internal_vars()) return -1; /* as we don't care about exec name */ argc--; argv++; if (argc && !strcmp(argv[0], "--help")) return dbg_winedbg_usage(TRUE); if (argc && !strcmp(argv[0], "--gdb")) { retv = gdb_main(argc, argv); if (retv == -1) dbg_winedbg_usage(FALSE); return retv; } dbg_init_console(); SymSetOptions((SymGetOptions() & ~(SYMOPT_UNDNAME)) | SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS | SYMOPT_AUTO_PUBLICS); if (argc && (!strcmp(argv[0], "--auto") || !strcmp(argv[0], "--minidump"))) { /* force some internal variables */ DBG_IVAR(BreakOnDllLoad) = 0; dbg_houtput = GetStdHandle(STD_ERROR_HANDLE); switch (dbg_active_auto(argc, argv)) { case start_ok: return 0; case start_error_parse: return dbg_winedbg_usage(FALSE); case start_error_init: return -1; } } /* parse options */ while (argc > 0 && argv[0][0] == '-') { if (!strcmp(argv[0], "--command")) { argc--; argv++; hFile = parser_generate_command_file(argv[0], NULL); if (hFile == INVALID_HANDLE_VALUE) { dbg_printf("Couldn't open temp file (%u)\n", GetLastError()); return 1; } argc--; argv++; continue; } if (!strcmp(argv[0], "--file")) { argc--; argv++; hFile = CreateFileA(argv[0], GENERIC_READ|DELETE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { dbg_printf("Couldn't open file %s (%u)\n", argv[0], GetLastError()); return 1; } argc--; argv++; continue; } if (!strcmp(argv[0], "--")) { argc--; argv++; break; } return dbg_winedbg_usage(FALSE); } if (!argc) ds = start_ok; else if ((ds = dbg_active_attach(argc, argv)) == start_error_parse && (ds = minidump_reload(argc, argv)) == start_error_parse) ds = dbg_active_launch(argc, argv); switch (ds) { case start_ok: break; case start_error_parse: return dbg_winedbg_usage(FALSE); case start_error_init: return -1; } dbg_start_interactive(hFile); return 0; }
/****************************************************************** * dbg_active_auto * * Starts (<pid> or <pid> <evt>) in automatic mode */ enum dbg_start dbg_active_auto(int argc, char* argv[]) { HANDLE hFile; enum dbg_start ds = start_error_parse; if (!strcmp(argv[0], "--auto")) { /* auto mode */ argc--; argv++; ds = dbg_active_attach(argc, argv); if (ds != start_ok) return ds; hFile = parser_generate_command_file("echo Modules:", "info share", "echo Threads:", "info threads", "backtrace", "detach", NULL); } else if (!strcmp(argv[0], "--minidump")) { const char* file = NULL; char tmp[8 + 1 + MAX_PATH]; /* minidump <file> */ argc--; argv++; /* hard stuff now ; we can get things like: * --minidump <pid> 1 arg * --minidump <pid> <evt> 2 args * --minidump <file> <pid> 2 args * --minidump <file> <pid> <evt> 3 args */ switch (argc) { case 1: ds = dbg_active_attach(argc, argv); break; case 2: if ((ds = dbg_active_attach(argc, argv)) != start_ok) { file = argv[0]; ds = dbg_active_attach(argc - 1, argv + 1); } break; case 3: file = argv[0]; ds = dbg_active_attach(argc - 1, argv + 1); break; default: return start_error_parse; } if (ds != start_ok) return ds; memcpy(tmp, "minidump \"", 10); if (!file) { char path[MAX_PATH]; GetTempPath(sizeof(path), path); GetTempFileName(path, "WD", 0, tmp + 10); } else strcpy(tmp + 10, file); strcat(tmp, "\""); if (!file) { /* FIXME: should generate unix name as well */ dbg_printf("Capturing program state in %s\n", tmp + 9); } hFile = parser_generate_command_file(tmp, "detach", NULL); } else return start_error_parse; if (hFile == INVALID_HANDLE_VALUE) return start_error_parse; if (dbg_curr_process->active_debuggee) dbg_active_wait_for_first_exception(); dbg_interactiveP = TRUE; parser_handle(hFile); return start_ok; }