OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 NULL); // TranslateAddress | 1242 NULL); // TranslateAddress |
1243 if (!ok) break; | 1243 if (!ok) break; |
1244 | 1244 |
1245 // Store the address. | 1245 // Store the address. |
1246 ASSERT((stack_frame.AddrPC.Offset >> 32) == 0); // 32-bit address. | 1246 ASSERT((stack_frame.AddrPC.Offset >> 32) == 0); // 32-bit address. |
1247 frames[frames_count].address = | 1247 frames[frames_count].address = |
1248 reinterpret_cast<void*>(stack_frame.AddrPC.Offset); | 1248 reinterpret_cast<void*>(stack_frame.AddrPC.Offset); |
1249 | 1249 |
1250 // Try to locate a symbol for this frame. | 1250 // Try to locate a symbol for this frame. |
1251 DWORD64 symbol_displacement; | 1251 DWORD64 symbol_displacement; |
1252 IMAGEHLP_SYMBOL64* symbol = NULL; | 1252 SmartPointer<IMAGEHLP_SYMBOL64> symbol( |
1253 symbol = NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen); | 1253 NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen)); |
1254 if (!symbol) return kStackWalkError; // Out of memory. | 1254 if (!symbol) return kStackWalkError; // Out of memory. |
1255 memset(symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen); | 1255 memset(*symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen); |
1256 symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); | 1256 symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); |
1257 symbol->MaxNameLength = kStackWalkMaxNameLen; | 1257 symbol->MaxNameLength = kStackWalkMaxNameLen; |
1258 ok = _SymGetSymFromAddr64(process_handle, // hProcess | 1258 ok = _SymGetSymFromAddr64(process_handle, // hProcess |
1259 stack_frame.AddrPC.Offset, // Address | 1259 stack_frame.AddrPC.Offset, // Address |
1260 &symbol_displacement, // Displacement | 1260 &symbol_displacement, // Displacement |
1261 symbol); // Symbol | 1261 *symbol); // Symbol |
1262 if (ok) { | 1262 if (ok) { |
1263 // Try to locate more source information for the symbol. | 1263 // Try to locate more source information for the symbol. |
1264 IMAGEHLP_LINE64 Line; | 1264 IMAGEHLP_LINE64 Line; |
1265 memset(&Line, 0, sizeof(Line)); | 1265 memset(&Line, 0, sizeof(Line)); |
1266 Line.SizeOfStruct = sizeof(Line); | 1266 Line.SizeOfStruct = sizeof(Line); |
1267 DWORD line_displacement; | 1267 DWORD line_displacement; |
1268 ok = _SymGetLineFromAddr64( | 1268 ok = _SymGetLineFromAddr64( |
1269 process_handle, // hProcess | 1269 process_handle, // hProcess |
1270 stack_frame.AddrPC.Offset, // dwAddr | 1270 stack_frame.AddrPC.Offset, // dwAddr |
1271 &line_displacement, // pdwDisplacement | 1271 &line_displacement, // pdwDisplacement |
(...skipping 15 matching lines...) Expand all Loading... |
1287 // Make sure line termination is in place. | 1287 // Make sure line termination is in place. |
1288 frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0'; | 1288 frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0'; |
1289 } else { | 1289 } else { |
1290 // No text representation of this frame | 1290 // No text representation of this frame |
1291 frames[frames_count].text[0] = '\0'; | 1291 frames[frames_count].text[0] = '\0'; |
1292 | 1292 |
1293 // Continue if we are just missing a module (for non C/C++ frames a | 1293 // Continue if we are just missing a module (for non C/C++ frames a |
1294 // module will never be found). | 1294 // module will never be found). |
1295 int err = GetLastError(); | 1295 int err = GetLastError(); |
1296 if (err != ERROR_MOD_NOT_FOUND) { | 1296 if (err != ERROR_MOD_NOT_FOUND) { |
1297 DeleteArray(symbol); | |
1298 break; | 1297 break; |
1299 } | 1298 } |
1300 } | 1299 } |
1301 DeleteArray(symbol); | |
1302 | 1300 |
1303 frames_count++; | 1301 frames_count++; |
1304 } | 1302 } |
1305 | 1303 |
1306 // Return the number of frames filled in. | 1304 // Return the number of frames filled in. |
1307 return frames_count; | 1305 return frames_count; |
1308 } | 1306 } |
1309 | 1307 |
1310 // Restore warnings to previous settings. | 1308 // Restore warnings to previous settings. |
1311 #pragma warning(pop) | 1309 #pragma warning(pop) |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1898 | 1896 |
1899 // Release the thread handles | 1897 // Release the thread handles |
1900 CloseHandle(data_->sampler_thread_); | 1898 CloseHandle(data_->sampler_thread_); |
1901 CloseHandle(data_->profiled_thread_); | 1899 CloseHandle(data_->profiled_thread_); |
1902 } | 1900 } |
1903 | 1901 |
1904 | 1902 |
1905 #endif // ENABLE_LOGGING_AND_PROFILING | 1903 #endif // ENABLE_LOGGING_AND_PROFILING |
1906 | 1904 |
1907 } } // namespace v8::internal | 1905 } } // namespace v8::internal |
OLD | NEW |