| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/profiler/native_stack_sampler.h" | 5 #include "base/profiler/native_stack_sampler.h" |
| 6 | 6 |
| 7 #include <objbase.h> | 7 #include <objbase.h> |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <winternl.h> | 10 #include <winternl.h> |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 NativeStackSamplerTestDelegate* test_delegate); | 391 NativeStackSamplerTestDelegate* test_delegate); |
| 392 ~NativeStackSamplerWin() override; | 392 ~NativeStackSamplerWin() override; |
| 393 | 393 |
| 394 // StackSamplingProfiler::NativeStackSampler: | 394 // StackSamplingProfiler::NativeStackSampler: |
| 395 void ProfileRecordingStarting( | 395 void ProfileRecordingStarting( |
| 396 std::vector<StackSamplingProfiler::Module>* modules) override; | 396 std::vector<StackSamplingProfiler::Module>* modules) override; |
| 397 void RecordStackSample(StackSamplingProfiler::Sample* sample) override; | 397 void RecordStackSample(StackSamplingProfiler::Sample* sample) override; |
| 398 void ProfileRecordingStopped() override; | 398 void ProfileRecordingStopped() override; |
| 399 | 399 |
| 400 private: | 400 private: |
| 401 enum { | 401 // Intended to hold the largest stack used by Chrome. The default Win32 |
| 402 // Intended to hold the largest stack used by Chrome. The default Win32 | 402 // reserved stack size is 1 MB and Chrome Windows threads currently always |
| 403 // reserved stack size is 1 MB and Chrome Windows threads currently always | 403 // use the default, but this allows for expansion if it occurs. The size |
| 404 // use the default, but this allows for expansion if it occurs. The size | 404 // beyond the actual stack size consists of unallocated virtual memory pages |
| 405 // beyond the actual stack size consists of unallocated virtual memory pages | 405 // so carries little cost (just a bit of wasted address space). |
| 406 // so carries little cost (just a bit of wasted address space). | 406 static constexpr size_t kStackCopyBufferSize = 2 * 1024 * 1024; |
| 407 kStackCopyBufferSize = 2 * 1024 * 1024 | |
| 408 }; | |
| 409 | 407 |
| 410 // Attempts to query the module filename, base address, and id for | 408 // Attempts to query the module filename, base address, and id for |
| 411 // |module_handle|, and store them in |module|. Returns true if it succeeded. | 409 // |module_handle|, and store them in |module|. Returns true if it succeeded. |
| 412 static bool GetModuleForHandle(HMODULE module_handle, | 410 static bool GetModuleForHandle(HMODULE module_handle, |
| 413 StackSamplingProfiler::Module* module); | 411 StackSamplingProfiler::Module* module); |
| 414 | 412 |
| 415 // Gets the index for the Module corresponding to |module_handle| in | 413 // Gets the index for the Module corresponding to |module_handle| in |
| 416 // |modules|, adding it if it's not already present. Returns | 414 // |modules|, adding it if it's not already present. Returns |
| 417 // StackSamplingProfiler::Frame::kUnknownModuleIndex if no Module can be | 415 // StackSamplingProfiler::Frame::kUnknownModuleIndex if no Module can be |
| 418 // determined for |module|. | 416 // determined for |module|. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 void NativeStackSamplerWin::ProfileRecordingStarting( | 465 void NativeStackSamplerWin::ProfileRecordingStarting( |
| 468 std::vector<StackSamplingProfiler::Module>* modules) { | 466 std::vector<StackSamplingProfiler::Module>* modules) { |
| 469 current_modules_ = modules; | 467 current_modules_ = modules; |
| 470 profile_module_index_.clear(); | 468 profile_module_index_.clear(); |
| 471 } | 469 } |
| 472 | 470 |
| 473 void NativeStackSamplerWin::RecordStackSample( | 471 void NativeStackSamplerWin::RecordStackSample( |
| 474 StackSamplingProfiler::Sample* sample) { | 472 StackSamplingProfiler::Sample* sample) { |
| 475 DCHECK(current_modules_); | 473 DCHECK(current_modules_); |
| 476 | 474 |
| 477 if (!stack_copy_buffer_) | |
| 478 return; | |
| 479 | |
| 480 std::vector<RecordedFrame> stack; | 475 std::vector<RecordedFrame> stack; |
| 481 SuspendThreadAndRecordStack(thread_handle_.Get(), thread_stack_base_address_, | 476 SuspendThreadAndRecordStack(thread_handle_.Get(), thread_stack_base_address_, |
| 482 stack_copy_buffer_.get(), kStackCopyBufferSize, | 477 stack_copy_buffer_.get(), kStackCopyBufferSize, |
| 483 &stack, annotator_, sample, test_delegate_); | 478 &stack, annotator_, sample, test_delegate_); |
| 484 CopyToSample(stack, sample, current_modules_); | 479 CopyToSample(stack, sample, current_modules_); |
| 485 } | 480 } |
| 486 | 481 |
| 487 void NativeStackSamplerWin::ProfileRecordingStopped() { | 482 void NativeStackSamplerWin::ProfileRecordingStopped() { |
| 488 current_modules_ = nullptr; | 483 current_modules_ = nullptr; |
| 489 } | 484 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 | 552 |
| 558 if (thread_handle) { | 553 if (thread_handle) { |
| 559 return std::unique_ptr<NativeStackSampler>(new NativeStackSamplerWin( | 554 return std::unique_ptr<NativeStackSampler>(new NativeStackSamplerWin( |
| 560 win::ScopedHandle(thread_handle), annotator, test_delegate)); | 555 win::ScopedHandle(thread_handle), annotator, test_delegate)); |
| 561 } | 556 } |
| 562 #endif | 557 #endif |
| 563 return std::unique_ptr<NativeStackSampler>(); | 558 return std::unique_ptr<NativeStackSampler>(); |
| 564 } | 559 } |
| 565 | 560 |
| 566 } // namespace base | 561 } // namespace base |
| OLD | NEW |