diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-17 23:29:55 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-17 23:29:55 +0000 |
commit | 8a65f28ef02c68fa3d6d94fee19287723983f057 (patch) | |
tree | e1e4ce71fcd4ef713b39825001922cb3651385d7 /base/debug | |
parent | a7cf736adbbf691ac85e6e7be5816cb4365cab98 (diff) | |
download | chromium_src-8a65f28ef02c68fa3d6d94fee19287723983f057.zip chromium_src-8a65f28ef02c68fa3d6d94fee19287723983f057.tar.gz chromium_src-8a65f28ef02c68fa3d6d94fee19287723983f057.tar.bz2 |
Remove --debug-on-start and --debug-children.
debug_on_start_win.cc also had some code to support --wait-for-debugger, but I
don't think it's important to preserve it. This would only have any effect in
modules which included debug_on_start.h, which was basically just test code; and
it also wouldn't have any effect when the component build is enabled, which I
suspect is true for most developers trying to run tests. I didn't remove any of
the other pieces of --wait-for-debugger elsewhere.
BUG=359822
TEST=none
R=darin@chromium.org
Review URL: https://codereview.chromium.org/227723008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264671 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/debug')
-rw-r--r-- | base/debug/debug_on_start_win.cc | 74 | ||||
-rw-r--r-- | base/debug/debug_on_start_win.h | 83 | ||||
-rw-r--r-- | base/debug/debugger.h | 4 | ||||
-rw-r--r-- | base/debug/debugger_posix.cc | 18 | ||||
-rw-r--r-- | base/debug/debugger_win.cc | 89 |
5 files changed, 1 insertions, 267 deletions
diff --git a/base/debug/debug_on_start_win.cc b/base/debug/debug_on_start_win.cc deleted file mode 100644 index 6ca88dd..0000000 --- a/base/debug/debug_on_start_win.cc +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/debug/debug_on_start_win.h" - -#include <windows.h> - -#include "base/base_switches.h" -#include "base/basictypes.h" -#include "base/debug/debugger.h" - -namespace base { -namespace debug { - -// Minimalist implementation to try to find a command line argument. We can use -// kernel32 exported functions but not the CRT functions because we're too early -// in the process startup. -// The code is not that bright and will find things like ---argument or -// /-/argument. -// Note: command_line is non-destructively modified. -bool DebugOnStart::FindArgument(wchar_t* command_line, const char* argument_c) { - wchar_t argument[50] = {}; - for (int i = 0; argument_c[i]; ++i) - argument[i] = argument_c[i]; - - int argument_len = lstrlen(argument); - int command_line_len = lstrlen(command_line); - while (command_line_len > argument_len) { - wchar_t first_char = command_line[0]; - wchar_t last_char = command_line[argument_len+1]; - // Try to find an argument. - if ((first_char == L'-' || first_char == L'/') && - (last_char == L' ' || last_char == 0 || last_char == L'=')) { - command_line[argument_len+1] = 0; - // Skip the - or / - if (lstrcmpi(command_line+1, argument) == 0) { - // Found it. - command_line[argument_len+1] = last_char; - return true; - } - // Fix back. - command_line[argument_len+1] = last_char; - } - // Continue searching. - ++command_line; - --command_line_len; - } - return false; -} - -// static -int __cdecl DebugOnStart::Init() { - // Try to find the argument. - if (FindArgument(GetCommandLine(), switches::kDebugOnStart)) { - // We can do 2 things here: - // - Ask for a debugger to attach to us. This involve reading the registry - // key and creating the process. - // - Do a int3. - - // It will fails if we run in a sandbox. That is expected. - base::debug::SpawnDebuggerOnProcess(GetCurrentProcessId()); - - // Wait for a debugger to come take us. - base::debug::WaitForDebugger(60, false); - } else if (FindArgument(GetCommandLine(), switches::kWaitForDebugger)) { - // Wait for a debugger to come take us. - base::debug::WaitForDebugger(60, true); - } - return 0; -} - -} // namespace debug -} // namespace base diff --git a/base/debug/debug_on_start_win.h b/base/debug/debug_on_start_win.h deleted file mode 100644 index edcaa0a..0000000 --- a/base/debug/debug_on_start_win.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Define the necessary code and global data to look for kDebugOnStart command -// line argument. When the command line argument is detected, it invokes the -// debugger, if no system-wide debugger is registered, a debug break is done. - -#ifndef BASE_DEBUG_DEBUG_ON_START_WIN_H_ -#define BASE_DEBUG_DEBUG_ON_START_WIN_H_ - -#include "base/basictypes.h" -#include "build/build_config.h" - -// This only works on Windows. It's legal to include on other platforms, but -// will be a NOP. -#if defined(OS_WIN) - -#ifndef DECLSPEC_SELECTANY -#define DECLSPEC_SELECTANY __declspec(selectany) -#endif - -namespace base { -namespace debug { - -// There is no way for this code, as currently implemented, to work across DLLs. -// TODO(rvargas): It looks like we really don't use this code, at least not for -// Chrome. Figure out if it's really worth implementing something simpler. -#if !defined(COMPONENT_BUILD) - -// Debug on start functions and data. -class DebugOnStart { - public: - // Expected function type in the .CRT$XI* section. - // Note: See VC\crt\src\internal.h for reference. - typedef int (__cdecl *PIFV)(void); - - // Looks at the command line for kDebugOnStart argument. If found, it invokes - // the debugger, if this fails, it crashes. - static int __cdecl Init(); - - // Returns true if the 'argument' is present in the 'command_line'. It does - // not use the CRT, only Kernel32 functions. - static bool FindArgument(wchar_t* command_line, const char* argument); -}; - -// Set the function pointer to our function to look for a crash on start. The -// XIB section is started pretty early in the program initialization so in -// theory it should be called before any user created global variable -// initialization code and CRT initialization code. -// Note: See VC\crt\src\defsects.inc and VC\crt\src\crt0.c for reference. -#ifdef _WIN64 - -// "Fix" the segment. On x64, the .CRT segment is merged into the .rdata segment -// so it contains const data only. -#pragma const_seg(push, ".CRT$XIB") -// Declare the pointer so the CRT will find it. -extern const DebugOnStart::PIFV debug_on_start; -DECLSPEC_SELECTANY const DebugOnStart::PIFV debug_on_start = - &DebugOnStart::Init; -// Fix back the segment. -#pragma const_seg(pop) - -#else // _WIN64 - -// "Fix" the segment. On x86, the .CRT segment is merged into the .data segment -// so it contains non-const data only. -#pragma data_seg(push, ".CRT$XIB") -// Declare the pointer so the CRT will find it. -DECLSPEC_SELECTANY DebugOnStart::PIFV debug_on_start = &DebugOnStart::Init; -// Fix back the segment. -#pragma data_seg(pop) - -#endif // _WIN64 - -#endif // defined(COMPONENT_BUILD) - -} // namespace debug -} // namespace base - -#endif // defined(OS_WIN) - -#endif // BASE_DEBUG_DEBUG_ON_START_WIN_H_ diff --git a/base/debug/debugger.h b/base/debug/debugger.h index 4f368d9..d62ea3f 100644 --- a/base/debug/debugger.h +++ b/base/debug/debugger.h @@ -14,10 +14,6 @@ namespace base { namespace debug { -// Starts the registered system-wide JIT debugger to attach it to specified -// process. -BASE_EXPORT bool SpawnDebuggerOnProcess(unsigned process_id); - // Waits wait_seconds seconds for a debugger to attach to the current process. // When silent is false, an exception is thrown when a debugger is detected. BASE_EXPORT bool WaitForDebugger(int wait_seconds, bool silent); diff --git a/base/debug/debugger_posix.cc b/base/debug/debugger_posix.cc index 6554f3f..48393f4 100644 --- a/base/debug/debugger_posix.cc +++ b/base/debug/debugger_posix.cc @@ -14,7 +14,6 @@ #include <sys/types.h> #include <unistd.h> -#include <string> #include <vector> #if defined(__GLIBCXX__) @@ -41,7 +40,6 @@ #include "base/posix/eintr_wrapper.h" #include "base/safe_strerror_posix.h" #include "base/strings/string_piece.h" -#include "base/strings/stringprintf.h" #if defined(USE_SYMBOLIZE) #include "base/third_party/symbolize/symbolize.h" @@ -54,22 +52,6 @@ namespace base { namespace debug { -bool SpawnDebuggerOnProcess(unsigned process_id) { -#if OS_ANDROID || OS_NACL - NOTIMPLEMENTED(); - return false; -#else - const std::string debug_cmd = - StringPrintf("xterm -e 'gdb --pid=%u' &", process_id); - LOG(WARNING) << "Starting debugger on pid " << process_id - << " with command `" << debug_cmd << "`"; - int ret = system(debug_cmd.c_str()); - if (ret == -1) - return false; - return true; -#endif -} - #if defined(OS_MACOSX) || defined(OS_BSD) // Based on Apple's recommended method as described in diff --git a/base/debug/debugger_win.cc b/base/debug/debugger_win.cc index b13dbfd..ccc9c16 100644 --- a/base/debug/debugger_win.cc +++ b/base/debug/debugger_win.cc @@ -4,99 +4,12 @@ #include "base/debug/debugger.h" +#include <stdlib.h> #include <windows.h> -#include <dbghelp.h> - -#include "base/basictypes.h" -#include "base/logging.h" namespace base { namespace debug { -namespace { - -// Minimalist key reader. -// Note: Does not use the CRT. -bool RegReadString(HKEY root, const wchar_t* subkey, - const wchar_t* value_name, wchar_t* buffer, int* len) { - HKEY key = NULL; - DWORD res = RegOpenKeyEx(root, subkey, 0, KEY_READ, &key); - if (ERROR_SUCCESS != res || key == NULL) - return false; - - DWORD type = 0; - DWORD buffer_size = *len * sizeof(wchar_t); - // We don't support REG_EXPAND_SZ. - res = RegQueryValueEx(key, value_name, NULL, &type, - reinterpret_cast<BYTE*>(buffer), &buffer_size); - if (ERROR_SUCCESS == res && buffer_size != 0 && type == REG_SZ) { - // Make sure the buffer is NULL terminated. - buffer[*len - 1] = 0; - *len = lstrlen(buffer); - RegCloseKey(key); - return true; - } - RegCloseKey(key); - return false; -} - -// Replaces each "%ld" in input per a value. Not efficient but it works. -// Note: Does not use the CRT. -bool StringReplace(const wchar_t* input, int value, wchar_t* output, - int output_len) { - memset(output, 0, output_len*sizeof(wchar_t)); - int input_len = lstrlen(input); - - for (int i = 0; i < input_len; ++i) { - int current_output_len = lstrlen(output); - - if (input[i] == L'%' && input[i + 1] == L'l' && input[i + 2] == L'd') { - // Make sure we have enough place left. - if ((current_output_len + 12) >= output_len) - return false; - - // Cheap _itow(). - wsprintf(output+current_output_len, L"%d", value); - i += 2; - } else { - if (current_output_len >= output_len) - return false; - output[current_output_len] = input[i]; - } - } - return true; -} - -} // namespace - -// Note: Does not use the CRT. -bool SpawnDebuggerOnProcess(unsigned process_id) { - wchar_t reg_value[1026]; - int len = arraysize(reg_value); - if (RegReadString(HKEY_LOCAL_MACHINE, - L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug", - L"Debugger", reg_value, &len)) { - wchar_t command_line[1026]; - if (StringReplace(reg_value, process_id, command_line, - arraysize(command_line))) { - // We don't mind if the debugger is present because it will simply fail - // to attach to this process. - STARTUPINFO startup_info = {0}; - startup_info.cb = sizeof(startup_info); - PROCESS_INFORMATION process_info = {0}; - - if (CreateProcess(NULL, command_line, NULL, NULL, FALSE, 0, NULL, NULL, - &startup_info, &process_info)) { - CloseHandle(process_info.hThread); - WaitForInputIdle(process_info.hProcess, 10000); - CloseHandle(process_info.hProcess); - return true; - } - } - } - return false; -} - bool BeingDebugged() { return ::IsDebuggerPresent() != 0; } |