xref: /aosp_15_r20/external/cronet/base/win/process_startup_helper.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/win/process_startup_helper.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <crtdbg.h>
8*6777b538SAndroid Build Coastguard Worker #include <new.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/base_switches.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker // Handlers for invalid parameter and pure call. They generate a breakpoint to
16*6777b538SAndroid Build Coastguard Worker // tell breakpad that it needs to dump the process.
17*6777b538SAndroid Build Coastguard Worker // These functions should be written to be unique in order to avoid confusing
18*6777b538SAndroid Build Coastguard Worker // call stacks from /OPT:ICF function folding. Printing a unique message or
19*6777b538SAndroid Build Coastguard Worker // returning a unique value will do this. Note that for best results they need
20*6777b538SAndroid Build Coastguard Worker // to be unique from *all* functions in Chrome.
InvalidParameter(const wchar_t * expression,const wchar_t * function,const wchar_t * file,unsigned int line,uintptr_t reserved)21*6777b538SAndroid Build Coastguard Worker void InvalidParameter(const wchar_t* expression,
22*6777b538SAndroid Build Coastguard Worker                       const wchar_t* function,
23*6777b538SAndroid Build Coastguard Worker                       const wchar_t* file,
24*6777b538SAndroid Build Coastguard Worker                       unsigned int line,
25*6777b538SAndroid Build Coastguard Worker                       uintptr_t reserved) {
26*6777b538SAndroid Build Coastguard Worker   __debugbreak();
27*6777b538SAndroid Build Coastguard Worker   // Use a different exit code from PureCall to avoid COMDAT folding.
28*6777b538SAndroid Build Coastguard Worker   _exit(1);
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
PureCall()31*6777b538SAndroid Build Coastguard Worker void PureCall() {
32*6777b538SAndroid Build Coastguard Worker   __debugbreak();
33*6777b538SAndroid Build Coastguard Worker   // Use a different exit code from InvalidParameter to avoid COMDAT folding.
34*6777b538SAndroid Build Coastguard Worker   _exit(2);
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker }  // namespace
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker namespace base {
40*6777b538SAndroid Build Coastguard Worker namespace win {
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker // Register the invalid param handler and pure call handler to be able to
43*6777b538SAndroid Build Coastguard Worker // notify breakpad when it happens.
RegisterInvalidParamHandler()44*6777b538SAndroid Build Coastguard Worker void RegisterInvalidParamHandler() {
45*6777b538SAndroid Build Coastguard Worker   _set_invalid_parameter_handler(InvalidParameter);
46*6777b538SAndroid Build Coastguard Worker   _set_purecall_handler(PureCall);
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker 
SetupCRT(const CommandLine & command_line)49*6777b538SAndroid Build Coastguard Worker void SetupCRT(const CommandLine& command_line) {
50*6777b538SAndroid Build Coastguard Worker #if defined(_CRTDBG_MAP_ALLOC)
51*6777b538SAndroid Build Coastguard Worker   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
52*6777b538SAndroid Build Coastguard Worker   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
53*6777b538SAndroid Build Coastguard Worker #else
54*6777b538SAndroid Build Coastguard Worker   if (!command_line.HasSwitch(switches::kDisableBreakpad)) {
55*6777b538SAndroid Build Coastguard Worker     _CrtSetReportMode(_CRT_ASSERT, 0);
56*6777b538SAndroid Build Coastguard Worker   }
57*6777b538SAndroid Build Coastguard Worker #endif
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker }  // namespace win
61*6777b538SAndroid Build Coastguard Worker }  // namespace base
62