Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Side by Side Diff: snapshot/win/process_reader_win.cc

Issue 1364803004: win: Save contents of TEBs allowing !teb and !gle to work in windbg (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@dump-without-crashing
Patch Set: . Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Crashpad Authors. All rights reserved. 1 // Copyright 2015 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 } 169 }
170 170
171 return true; 171 return true;
172 } 172 }
173 173
174 } // namespace 174 } // namespace
175 175
176 ProcessReaderWin::Thread::Thread() 176 ProcessReaderWin::Thread::Thread()
177 : context(), 177 : context(),
178 id(0), 178 id(0),
179 teb(0), 179 teb_address(0),
180 teb_size(0),
180 stack_region_address(0), 181 stack_region_address(0),
181 stack_region_size(0), 182 stack_region_size(0),
182 suspend_count(0), 183 suspend_count(0),
183 priority_class(0), 184 priority_class(0),
184 priority(0) { 185 priority(0) {
185 } 186 }
186 187
187 ProcessReaderWin::ProcessReaderWin() 188 ProcessReaderWin::ProcessReaderWin()
188 : process_(INVALID_HANDLE_VALUE), 189 : process_(INVALID_HANDLE_VALUE),
189 process_info_(), 190 process_info_(),
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 sizeof(thread_basic_info), 325 sizeof(thread_basic_info),
325 nullptr); 326 nullptr);
326 if (!NT_SUCCESS(status)) { 327 if (!NT_SUCCESS(status)) {
327 NTSTATUS_LOG(ERROR, status) << "NtQueryInformationThread"; 328 NTSTATUS_LOG(ERROR, status) << "NtQueryInformationThread";
328 continue; 329 continue;
329 } 330 }
330 331
331 // Read the TIB (Thread Information Block) which is the first element of the 332 // Read the TIB (Thread Information Block) which is the first element of the
332 // TEB, for its stack fields. 333 // TEB, for its stack fields.
333 process_types::NT_TIB<Traits> tib; 334 process_types::NT_TIB<Traits> tib;
334 thread.teb = thread_basic_info.TebBaseAddress; 335 thread.teb_address = thread_basic_info.TebBaseAddress;
335 if (ReadMemory(thread.teb, sizeof(tib), &tib)) { 336 thread.teb_size = sizeof(process_types::TEB<Traits>);
337 if (ReadMemory(thread.teb_address, sizeof(tib), &tib)) {
336 WinVMAddress base = 0; 338 WinVMAddress base = 0;
337 WinVMAddress limit = 0; 339 WinVMAddress limit = 0;
338 // If we're reading a WOW64 process, then the TIB we just retrieved is the 340 // If we're reading a WOW64 process, then the TIB we just retrieved is the
339 // x64 one. The first word of the x64 TIB points at the x86 TIB. See 341 // x64 one. The first word of the x64 TIB points at the x86 TIB. See
340 // https://msdn.microsoft.com/en-us/library/dn424783.aspx 342 // https://msdn.microsoft.com/en-us/library/dn424783.aspx
341 if (is_64_reading_32) { 343 if (is_64_reading_32) {
342 process_types::NT_TIB<process_types::internal::Traits32> tib32; 344 process_types::NT_TIB<process_types::internal::Traits32> tib32;
343 thread.teb = tib.Wow64Teb; 345 thread.teb_address = tib.Wow64Teb;
344 if (ReadMemory(thread.teb, sizeof(tib32), &tib32)) { 346 thread.teb_size =
347 sizeof(process_types::TEB<process_types::internal::Traits32>);
348 if (ReadMemory(thread.teb_address, sizeof(tib32), &tib32)) {
345 base = tib32.StackBase; 349 base = tib32.StackBase;
346 limit = tib32.StackLimit; 350 limit = tib32.StackLimit;
347 } 351 }
348 } else { 352 } else {
349 base = tib.StackBase; 353 base = tib.StackBase;
350 limit = tib.StackLimit; 354 limit = tib.StackLimit;
351 } 355 }
352 356
353 // Note, "backwards" because of direction of stack growth. 357 // Note, "backwards" because of direction of stack growth.
354 thread.stack_region_address = limit; 358 thread.stack_region_address = limit;
355 if (limit > base) { 359 if (limit > base) {
356 LOG(ERROR) << "invalid stack range: " << base << " - " << limit; 360 LOG(ERROR) << "invalid stack range: " << base << " - " << limit;
357 thread.stack_region_size = 0; 361 thread.stack_region_size = 0;
358 } else { 362 } else {
359 thread.stack_region_size = base - limit; 363 thread.stack_region_size = base - limit;
360 } 364 }
361 } 365 }
362 threads_.push_back(thread); 366 threads_.push_back(thread);
363 } 367 }
364 } 368 }
365 369
366 } // namespace crashpad 370 } // namespace crashpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698