simple_symbol_supplier.cc revision 7573d1dd4412171794f76bea833e4ae5f72929f8
1c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// Copyright (c) 2006, Google Inc. 2c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// All rights reserved. 3c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// 4c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// Redistribution and use in source and binary forms, with or without 5c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// modification, are permitted provided that the following conditions are 6c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// met: 7c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// 8c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// * Redistributions of source code must retain the above copyright 9c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// notice, this list of conditions and the following disclaimer. 10c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// * Redistributions in binary form must reproduce the above 11c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// copyright notice, this list of conditions and the following disclaimer 12c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// in the documentation and/or other materials provided with the 13c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// distribution. 14c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// * Neither the name of Google Inc. nor the names of its 15c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// contributors may be used to endorse or promote products derived from 16c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// this software without specific prior written permission. 17c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// 18c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 30c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// simple_symbol_supplier.cc: A simple SymbolSupplier implementation 31c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// 32c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// See simple_symbol_supplier.h for documentation. 33c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// 34c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai// Author: Mark Mentovai 35c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 36c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai#include "processor/simple_symbol_supplier.h" 37fe82bf24a93d9d3affd614aaa23f2f018a733d8emmentovai#include "google_airbag/processor/minidump.h" 38c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai#include "processor/pathname_stripper.h" 39c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 40c34850a2023442a22fa653ab8546e72738ed2dd4mmentovainamespace google_airbag { 41c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 427573d1dd4412171794f76bea833e4ae5f72929f8mmentovaistring SimpleSymbolSupplier::GetSymbolFileAtPath(MinidumpModule *module, 437573d1dd4412171794f76bea833e4ae5f72929f8mmentovai const string &root_path) { 44c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // For now, only support modules that have GUIDs - which means 45c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // MDCVInfoPDB70. 46c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 47c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai if (!module) 48c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai return ""; 49c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 50c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai const MDCVInfoPDB70 *cv_record = 51c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai reinterpret_cast<const MDCVInfoPDB70*>(module->GetCVRecord()); 52c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai if (!cv_record) 53c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai return ""; 54c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 55c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai if (cv_record->cv_signature != MD_CVINFOPDB70_SIGNATURE) 56c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai return ""; 57c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 58c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // Start with the base path. 597573d1dd4412171794f76bea833e4ae5f72929f8mmentovai string path = root_path; 60c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 61c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // Append the pdb file name as a directory name. 62c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append("/"); 63c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai string pdb_file_name = PathnameStripper::File( 64c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai reinterpret_cast<const char *>(cv_record->pdb_file_name)); 65c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append(pdb_file_name); 66c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 67c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // Append the uuid and age as a directory name. 68c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append("/"); 69c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai char uuid_age_string[43]; 70c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai snprintf(uuid_age_string, sizeof(uuid_age_string), 7180866e79454cefc5570b01dbb0a723185eae653cmmentovai "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%X", 72c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data1, cv_record->signature.data2, 73c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data3, 74c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data4[0], cv_record->signature.data4[1], 75c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data4[2], cv_record->signature.data4[3], 76c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data4[4], cv_record->signature.data4[5], 77c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->signature.data4[6], cv_record->signature.data4[7], 78c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai cv_record->age); 79c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append(uuid_age_string); 80c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 81c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // Transform the pdb file name into one ending in .sym. If the existing 82c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // name ends in .pdb, strip the .pdb. Otherwise, add .sym to the non-.pdb 83c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai // name. 84c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append("/"); 85c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai string pdb_file_extension = pdb_file_name.substr(pdb_file_name.size() - 4); 86c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai transform(pdb_file_extension.begin(), pdb_file_extension.end(), 87c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai pdb_file_extension.begin(), tolower); 88c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai if (pdb_file_extension == ".pdb") { 89c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append(pdb_file_name.substr(0, pdb_file_name.size() - 4)); 90c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai } else { 91c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append(pdb_file_name); 92c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai } 93c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai path.append(".sym"); 94c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 95c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai return path; 96c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai} 97c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai 98c34850a2023442a22fa653ab8546e72738ed2dd4mmentovai} // namespace google_airbag 99