OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <windows.h> | |
6 | |
7 #include "base/debug_on_start.h" | |
8 | |
9 #include "base/base_switches.h" | |
10 #include "base/basictypes.h" | |
11 #include "base/debug/debugger.h" | |
12 | |
13 // Minimalist implementation to try to find a command line argument. We can use | |
14 // kernel32 exported functions but not the CRT functions because we're too early | |
15 // in the process startup. | |
16 // The code is not that bright and will find things like ---argument or | |
17 // /-/argument. | |
18 // Note: command_line is non-destructively modified. | |
19 bool DebugOnStart::FindArgument(wchar_t* command_line, const char* argument_c) { | |
20 wchar_t argument[50]; | |
21 for (int i = 0; argument_c[i]; ++i) | |
22 argument[i] = argument_c[i]; | |
23 | |
24 int argument_len = lstrlen(argument); | |
25 int command_line_len = lstrlen(command_line); | |
26 while (command_line_len > argument_len) { | |
27 wchar_t first_char = command_line[0]; | |
28 wchar_t last_char = command_line[argument_len+1]; | |
29 // Try to find an argument. | |
30 if ((first_char == L'-' || first_char == L'/') && | |
31 (last_char == L' ' || last_char == 0 || last_char == L'=')) { | |
32 command_line[argument_len+1] = 0; | |
33 // Skip the - or / | |
34 if (lstrcmpi(command_line+1, argument) == 0) { | |
35 // Found it. | |
36 command_line[argument_len+1] = last_char; | |
37 return true; | |
38 } | |
39 // Fix back. | |
40 command_line[argument_len+1] = last_char; | |
41 } | |
42 // Continue searching. | |
43 ++command_line; | |
44 --command_line_len; | |
45 } | |
46 return false; | |
47 } | |
48 | |
49 // static | |
50 int __cdecl DebugOnStart::Init() { | |
51 // Try to find the argument. | |
52 if (FindArgument(GetCommandLine(), switches::kDebugOnStart)) { | |
53 // We can do 2 things here: | |
54 // - Ask for a debugger to attach to us. This involve reading the registry | |
55 // key and creating the process. | |
56 // - Do a int3. | |
57 | |
58 // It will fails if we run in a sandbox. That is expected. | |
59 base::debug::SpawnDebuggerOnProcess(GetCurrentProcessId()); | |
60 | |
61 // Wait for a debugger to come take us. | |
62 base::debug::WaitForDebugger(60, false); | |
63 } else if (FindArgument(GetCommandLine(), switches::kWaitForDebugger)) { | |
64 // Wait for a debugger to come take us. | |
65 base::debug::WaitForDebugger(60, true); | |
66 } | |
67 return 0; | |
68 } | |
OLD | NEW |