Index: experimental/windows_debugger/debugger/test_debugger/test_debugger.cc |
diff --git a/experimental/windows_debugger/debugger/test_debugger/test_debugger.cc b/experimental/windows_debugger/debugger/test_debugger/test_debugger.cc |
deleted file mode 100644 |
index 3cf4700f43c7c2f6b000a775f31a35b4ddf43f2b..0000000000000000000000000000000000000000 |
--- a/experimental/windows_debugger/debugger/test_debugger/test_debugger.cc |
+++ /dev/null |
@@ -1,364 +0,0 @@ |
-#include <conio.h> |
-#include <time.h> |
- |
-#include "debugger/core/debug_api.h" |
-#include "debugger/core/debug_execution_engine.h" |
-#include "debugger/core/debuggee_process.h" |
-#include "debugger/core/debuggee_thread.h" |
-#include "debug_continue_policy.h" |
-#include "debugger/core/debug_logger.h" |
-#include "debugger/base/debug_utils.h" |
-#include "debugger/base/debug_blob.h" |
-#include "debugger/base/debug_command_line.h" |
- |
-#include "debugger/base/debug_utils.h" |
-#include "debug_debug_event2.h" |
- |
-#pragma warning(disable : 4996) |
- |
-bool FindNexeThread(debug::ExecutionEngine& dbg_core, int* pid, int* tid); |
- |
-void* BlobToCBuff(const debug::Blob& blob) { |
- SIZE_T num = blob.size(); |
- char* buff = static_cast<char*>(malloc(num)); |
- if (NULL != buff) { |
- for (size_t i = 0; i < num; i++) |
- buff[i] = blob[i]; |
- } |
- return buff; |
-} |
- |
-namespace { |
-const char* GetDebugeeStateName(debug::DebuggeeProcess::State st) { |
- switch (st) { |
- case debug::DebuggeeProcess::kRunning: return "RUNNING"; |
- case debug::DebuggeeProcess::kHalted: return "kHalted"; |
- case debug::DebuggeeProcess::kDead: return "DEAD"; |
- } |
- return "N/A"; |
-} |
-} // namespace |
- |
-class MyExecutionEngine : public debug::ExecutionEngine { |
- public: |
- MyExecutionEngine(debug::DebugAPI* debug_api) : debug::ExecutionEngine(debug_api) {} |
- |
- protected: |
- virtual int OnDebugEvent(const DEBUG_EVENT& debug_event); |
-}; |
- |
-bool print_all_deb_events = true; |
- |
-int main(int argc, char* argv[]) { |
- //debug::Logger log; |
- debug::TextFileLogger log; |
- log.Open("debug_log.txt"); |
- log.EnableStdout(true); |
- debug::Logger::SetGlobalLogger(&log); |
- debug::DebugAPI debug_api; |
- |
- MyExecutionEngine dbg_core(&debug_api); |
- debug::StandardContinuePolicy continue_policy; |
- |
-// test only! it works! |
-// HMODULE hLib = ::LoadLibrary("D:\\chromuim_648_12\\src\\build\\Debug\\nacl64.exe"); |
-// FARPROC fp = ::GetProcAddress(hLib, "SetNumberOfExtensions"); |
- |
-#ifdef _WIN64 |
-// const char* cmd = "D:\\chromuim_648_12\\src\\build\\Debug\\chrome.exe"; // --no-sandbox"; |
-// const char* work_dir = NULL; //"D:\\chromuim_648_12\\src\\build\\Debug"; |
-#else |
-// const char* cmd = "C:\\work\\chromuim_648_12\\src\\build\\Debug\\chrome.exe"; |
-// const char* work_dir = NULL; //"C:\\work\\chromuim_648_12\\src\\build\\Debug"; |
-#endif |
- |
- debug::CommandLine cmd(argc - 1, argv + 1); |
- std::string cmd_line = cmd.ToString(); |
- |
- bool start_res = dbg_core.StartProcess(cmd_line.c_str(), NULL); |
- if (!start_res) { |
- printf("Can't start [%s] in [%s].\n", cmd_line.c_str(), NULL); |
- } else { |
- DBG_LOG("TR51.00", "msg='Debug session started'"); |
- DBG_LOG("TR51.01", "msg='Process started' cmd='%s'", cmd_line.c_str()); |
- |
-// int current_process = 0; |
-// int current_thread = 0; |
- do { |
- int pid = 0; |
- bool dbg_event = dbg_core.WaitForDebugEventAndDispatchIt(0, &pid); |
- debug::IDebuggeeProcess* halted_process = dbg_core.GetProcess(pid); |
- |
- if (NULL != halted_process) { |
- debug::DecisionToContinue dtc; |
- continue_policy.MakeContinueDecision(dbg_core.debug_event(), |
- halted_process->GetHaltedThread(), |
- &dtc); |
- //dtc.halt_debuggee_ = true; |
- int nacl_event_id = dbg_core.debug_event().nacl_debug_event_code(); |
- if (debug::DebugEvent::kNotNaClDebugEvent != nacl_event_id) { |
- DBG_LOG("TR51.02", "DebugEvent::nacl_debug_event_code_ = %d", nacl_event_id); |
- } |
- |
- DBG_LOG("TR51.03", "msg=DecisionToContinue continue=%s pass_exception=%s", |
- dtc.IsHaltDecision() ? "no" : "yes", |
- dtc.pass_exception_to_debuggee() ? "yes" : "no"); |
- |
-#ifdef Z00 |
- if (0 && (dbg_core.debug_event().windows_debug_event().dwDebugEventCode == EXCEPTION_DEBUG_EVENT)) { |
- if (dbg_core.debug_event().windows_debug_event().u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) { |
- dtc.halt_debuggee_ = true; |
- dtc.decision_strength_ = debug::DecisionToContinue::kStrongDecision; |
- printf("Breakpoint hit\n"); |
- } |
- } |
- |
- if (dbg_core.debug_event().windows_debug_event().dwDebugEventCode == EXIT_THREAD_DEBUG_EVENT) { |
- dtc.halt_debuggee_ = true; |
- dtc.decision_strength_ = debug::DecisionToContinue::kStrongDecision; |
- printf("Thread exiting\n"); |
- } |
-#endif |
- if (!dtc.IsHaltDecision()) { |
- if (dtc.pass_exception_to_debuggee()) |
- halted_process->ContinueAndPassExceptionToDebuggee(); |
- else |
- halted_process->Continue(); |
- halted_process = NULL; |
- } |
- } |
- |
- if (NULL == halted_process) { |
- if (!_kbhit()) |
- continue; |
- |
- char cmd[100] = {0}; |
- printf(">"); |
- gets(cmd); |
- DBG_LOG("TR51.04", "user_command='%s'", cmd); |
- if (0 == strcmp(cmd, "quit")) { |
- dbg_core.Stop(300); |
- break; |
- } |
- |
- if (0 == strncmp(cmd, "break", 5)) { |
- int pid = sscanf(cmd + strlen("break"), "%d", &pid); |
- debug::IDebuggeeProcess* proc = dbg_core.GetProcess(pid); |
- if (NULL != proc) |
- proc->Break(); |
- } else if (0 == strncmp(cmd, "e-", 2)) { |
- print_all_deb_events = false; |
- } |
- } else { |
- debug::DebuggeeThread* thread = halted_process->GetHaltedThread(); |
- int tid = 0; |
- if (NULL != thread) |
- tid = thread->id(); |
- |
- while(true) { |
- printf("%d:%d>", halted_process->id(), tid); |
- char cmd[100] = {0}; |
- gets(cmd); |
- DBG_LOG("TR51.05", "user_command='%s'", cmd); |
- if (0 == strcmp(cmd, "quit")) { |
- dbg_core.Stop(300); |
- break; |
- } else if (0 == strncmp(cmd, "e-", 2)) { |
- print_all_deb_events = false; |
- } else if (0 == strncmp(cmd, "attach", 6)) { |
- int id = 0; |
- int sn = sscanf(cmd + 7, "%d", &id); |
- dbg_core.AttachToProcess(id); |
- } else if (0 == strncmp(cmd, "detach", 6)) { |
- dbg_core.DetachAll(); |
- } else if (0 == strncmp(cmd, "br ", strlen("br "))) { |
- void* addr = 0; |
- int sn = sscanf(cmd + strlen("br "), "%p", &addr); |
- if ((NULL != halted_process) && (sn != 0)) |
- halted_process->SetBreakpoint(addr); |
- continue; |
- } else if (0 == strncmp(cmd, "rmbr ", strlen("rmbr "))) { |
- void* addr = 0; |
- int sn = sscanf(cmd + strlen("rmbr "), "%p", &addr); |
- if ((NULL != halted_process) && (sn != 0)) |
- halted_process->RemoveBreakpoint(addr); |
- continue; |
- } else if (0 == strcmp(cmd, "info threads")) { |
- std::deque<int> processes; |
- dbg_core.GetProcessIds(&processes); |
- for (size_t p = 0; p < processes.size(); p++) { |
- int pid = processes[p]; |
- debug::DebuggeeProcess* proc = static_cast<debug::DebuggeeProcess*>(dbg_core.GetProcess(pid)); |
- if (proc == halted_process) |
- printf("process * %d", pid); |
- else |
- printf("process %d", pid); |
- printf(" %d-bits", debug::Utils::GetProcessorWordSizeInBits(proc->handle())); |
- |
- if (NULL != proc) { |
- debug::DebuggeeProcess::State st = proc->state(); |
- printf(" %s ", (debug::DebuggeeProcess::kHalted == st) ? "Halted" : GetDebugeeStateName(st)); |
- std::string name; |
- std::string cmd; |
- debug::Utils::GetProcessName(proc->id(), &name); |
- debug::Utils::GetProcessCmdLine(proc->handle(), &cmd); |
- printf(" exe=[%s] cmd_line=[%s]\n", name.c_str(), cmd.c_str()); |
- } else { |
- printf("\n"); |
- } |
- if (NULL != proc) { |
- std::deque<int> threads; |
- proc->GetThreadIds(&threads); |
- for (size_t i = 0; i < threads.size(); i++) { |
- int id = threads[i]; |
- debug::DebuggeeThread* thr = proc->GetThread(id); |
- bool current = (thr == thread); |
- const char* status = thr->GetStateName(thr->state()); |
- const char* is_nexe = thr->IsNaClAppThread() ? "[I'm nexe thread]" : ""; |
- printf(" %s%d ""ip=%p %s %s\n", |
- current ? "*" : " ", |
- id, |
- (void*)thr->GetIP(), status, is_nexe); |
- } |
- } |
- } |
- continue; |
- } else if (0 == strcmp(cmd, "c")) { |
- if (NULL != halted_process) |
- halted_process->Continue(); |
- break; |
- } else if (0 == strncmp(cmd, "ct", 2)) { |
- if (NULL != thread) { |
- CONTEXT ct; |
- thread->GetContext(&ct); |
- } |
- } else if (0 == strncmp(cmd, "m", 1)) { |
- void* addr = 0; |
- int sz = 0; |
- sscanf(cmd + 2, "%p %d", &addr, &sz); |
- char data[2000]; |
- if (NULL != halted_process) { |
- halted_process->ReadMemory(addr, sz, data); |
- debug::Blob blob(data, sz); |
- std::string str = blob.ToHexString(false); |
- printf("[%s]\n", str.c_str()); |
- } |
- continue; |
- } else if (0 == strncmp(cmd, "M", 1)) { |
- long long addr = 0; |
- sscanf(cmd + 2, "%llx", &addr); |
- char* p = strchr(cmd, ' '); |
- p = strchr(p + 1, ' '); |
- debug::Blob blob; |
- blob.LoadFromHexString(std::string(p)); |
- if (NULL != halted_process) { |
- void* data = BlobToCBuff(blob); |
- halted_process->WriteMemory((const void*)addr, blob.size(), data); |
- free(data); |
- } |
- continue; |
- } else if (0 == strcmp(cmd, "s")) { |
- if (NULL != halted_process) |
- halted_process->SingleStep(); |
- } else if (0 == strcmp(cmd, "ip")) { |
- if (NULL != thread) { |
- void* ip = thread->GetIP(); |
- printf("%p\n", ip); |
- } |
- continue; |
- } else if (0 == strcmp(cmd, "ip++")) { |
- if (NULL != thread) { |
- char* ip = static_cast<char*>(thread->GetIP()); |
- thread->SetIP(ip++); |
- printf("%p\n", ip); |
- } |
- continue; |
- } |
- } |
- } |
- } while(true); |
- } |
- |
- printf("Done. Ready to exit..."); |
- getchar(); |
- return 0; |
-} |
- |
-unsigned char* my_strstr(unsigned char* str, size_t str_length, unsigned char* substr, size_t substr_length) { |
- for (size_t i = 0; i < str_length; i++ ) { |
- unsigned char* p = str + i; |
- size_t str_length_now = str_length - i; |
- if (str_length_now < substr_length) |
- return NULL; |
- |
- if (memcmp(p, substr, substr_length) == 0) |
- return p; |
- } |
- return 0; |
-} |
- |
-bool FindNexeThread(debug::ExecutionEngine& dbg_core, int* pid, int* tid) { |
- std::deque<int> processes; |
- dbg_core.GetProcessIds(&processes); |
- for (size_t p = 0; p < processes.size(); p++) { |
- debug::IDebuggeeProcess* proc = dbg_core.GetProcess(processes[p]); |
- if (NULL != proc) { |
- std::deque<int> threads; |
- proc->GetThreadIds(&threads); |
- for (size_t i = 0; i < threads.size(); i++) { |
- debug::DebuggeeThread* thr = proc->GetThread(threads[i]); |
- if (thr && thr->IsNaClAppThread()) { |
- *pid = processes[p]; |
- *tid = threads[i]; |
- return false; |
- } |
- } |
- } |
- } |
- return false; |
-} |
- |
-int MyExecutionEngine::OnDebugEvent(const DEBUG_EVENT& debug_event) { |
- if (print_all_deb_events) { |
- std::string text; |
- debug::DEBUG_EVENT_ToJSON(debug_event, &text); |
- DBG_LOG("TR51.06", "debug_event=%s", text.c_str()); |
- |
- if (CREATE_PROCESS_DEBUG_EVENT == debug_event.dwDebugEventCode) { |
- std::string cmd_line; |
- debug::Utils::GetProcessCmdLine(debug_event.u.CreateProcessInfo.hProcess, &cmd_line); |
- DBG_LOG("TR51.09", "cmd_line='%s'", cmd_line.c_str()); |
- } else if (LOAD_DLL_DEBUG_EVENT == debug_event.dwDebugEventCode) { |
- debug::DebuggeeProcess* proc = static_cast<debug::DebuggeeProcess*>(GetProcess(debug_event.dwProcessId)); |
- if (proc) { |
- std::string path; |
- bool r = debug::Utils::ReadUnucodeStr(proc->handle(), debug_event.u.LoadDll.lpImageName, &path); |
- DBG_LOG("TR51.10", "LOAD_DLL='%s'", path.c_str()); |
- } |
- } |
- } |
- |
- debug::IDebuggeeProcess* proc = GetProcess(debug_event.dwProcessId); |
- if (proc) { |
- debug::DebuggeeThread* thread = proc->GetThread(debug_event.dwThreadId); |
- if (thread) { |
- void* ip = thread->GetIP(); |
- DBG_LOG("TR51.07", "debug_event_ip' ip=0x%p pid=%d tid=%d", |
- ip, |
- debug_event.dwProcessId, |
- debug_event.dwThreadId); |
- } |
- } |
- |
- int pid = ExecutionEngine::OnDebugEvent(debug_event); |
- |
- proc = GetProcess(debug_event.dwProcessId); |
- if (proc) { |
- DBG_LOG("TR51.08", "debug_event_end WoW=%s pid=%d tid=%d", |
- proc->IsWoW() ? "yes" : "no", |
- debug_event.dwProcessId, |
- debug_event.dwThreadId); |
- } |
- return pid; |
-} |
- |