Adding support for 64-bit Windows modules to ms_symbol_server_converter.

As part of that:
 - Updated MSSymbolServerConverter to also download the executable files from the symbol server and pass them to the PDBSourceLineWriter as it is required for successful conversion of symbols for 64-bit modules.
 - Added a .gyp file and target for the ms_symbol_server_converter library.
 - Updated PDBSourceLineWriter to allow executable files to be in locations different from the locations of the PDB files.
 - Minor style issue:
    * #define guards.
    * No space before ')' and after '('.

R=mark@chromium.org, wfh@chromium.org

Review URL: https://breakpad.appspot.com/1434002

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1309 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
ivan.penkov@gmail.com 2014-04-10 17:54:52 +00:00
parent 7dbca422d4
commit 6b0703a093
12 changed files with 875 additions and 687 deletions

View file

@ -1,59 +1,64 @@
// Copyright 2013 Google Inc. All rights reserved. // Copyright 2013 Google Inc. All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Utilities for loading debug streams and tables from a PDB file. // Utilities for loading debug streams and tables from a PDB file.
#include <Windows.h> #ifndef COMMON_WINDOWS_DIA_UTIL_H_
#include <dia2.h> #define COMMON_WINDOWS_DIA_UTIL_H_
namespace google_breakpad { #include <Windows.h>
#include <dia2.h>
// Find the debug stream of the given |name| in the given |session|. Returns
// true on success, false on error of if the stream does not exist. On success namespace google_breakpad {
// the stream will be returned via |debug_stream|.
bool FindDebugStream(const wchar_t* name, // Find the debug stream of the given |name| in the given |session|. Returns
IDiaSession* session, // true on success, false on error of if the stream does not exist. On success
IDiaEnumDebugStreamData** debug_stream); // the stream will be returned via |debug_stream|.
bool FindDebugStream(const wchar_t* name,
// Finds the first table implementing the COM interface with ID |iid| in the IDiaSession* session,
// given |session|. Returns true on success, false on error or if no such IDiaEnumDebugStreamData** debug_stream);
// table is found. On success the table will be returned via |table|.
bool FindTable(REFIID iid, IDiaSession* session, void** table); // Finds the first table implementing the COM interface with ID |iid| in the
// given |session|. Returns true on success, false on error or if no such
// A templated version of FindTable. Finds the first table implementing type // table is found. On success the table will be returned via |table|.
// |InterfaceType| in the given |session|. Returns true on success, false on bool FindTable(REFIID iid, IDiaSession* session, void** table);
// error or if no such table is found. On success the table will be returned via
// |table|. // A templated version of FindTable. Finds the first table implementing type
template<typename InterfaceType> // |InterfaceType| in the given |session|. Returns true on success, false on
bool FindTable(IDiaSession* session, InterfaceType** table) { // error or if no such table is found. On success the table will be returned via
return FindTable(__uuidof(InterfaceType), // |table|.
session, template<typename InterfaceType>
reinterpret_cast<void**>(table)); bool FindTable(IDiaSession* session, InterfaceType** table) {
} return FindTable(__uuidof(InterfaceType),
session,
} // namespace google_breakpad reinterpret_cast<void**>(table));
}
} // namespace google_breakpad
#endif // COMMON_WINDOWS_DIA_UTIL_H_

View file

@ -29,8 +29,8 @@
// guid_string.cc: Convert GUIDs to strings. // guid_string.cc: Convert GUIDs to strings.
#ifndef COMMON_WINDOWS_GUID_STRING_H__ #ifndef COMMON_WINDOWS_GUID_STRING_H_
#define COMMON_WINDOWS_GUID_STRING_H__ #define COMMON_WINDOWS_GUID_STRING_H_
#include <Guiddef.h> #include <Guiddef.h>
@ -55,4 +55,4 @@ class GUIDString {
} // namespace google_breakpad } // namespace google_breakpad
#endif // COMMON_WINDOWS_GUID_STRING_H__ #endif // COMMON_WINDOWS_GUID_STRING_H_

View file

@ -31,12 +31,12 @@
// request using wininet. It currently supports requests that contain // request using wininet. It currently supports requests that contain
// a set of string parameters (key/value pairs), and a file to upload. // a set of string parameters (key/value pairs), and a file to upload.
#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H__ #ifndef COMMON_WINDOWS_HTTP_UPLOAD_H_
#define COMMON_WINDOWS_HTTP_UPLOAD_H__ #define COMMON_WINDOWS_HTTP_UPLOAD_H_
#pragma warning( push ) #pragma warning(push)
// Disable exception handler warnings. // Disable exception handler warnings.
#pragma warning( disable : 4530 ) #pragma warning(disable : 4530)
#include <Windows.h> #include <Windows.h>
#include <WinInet.h> #include <WinInet.h>
@ -121,6 +121,6 @@ class HTTPUpload {
} // namespace google_breakpad } // namespace google_breakpad
#pragma warning( pop ) #pragma warning(pop)
#endif // COMMON_WINDOWS_HTTP_UPLOAD_H__ #endif // COMMON_WINDOWS_HTTP_UPLOAD_H_

View file

@ -1,72 +1,72 @@
// Copyright 2013 Google Inc. All rights reserved. // Copyright 2013 Google Inc. All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Provides an API for mapping symbols through OMAP information, if a PDB file // Provides an API for mapping symbols through OMAP information, if a PDB file
// is augmented with it. This allows breakpad to work with addresses in // is augmented with it. This allows breakpad to work with addresses in
// transformed images by transforming the symbols themselves, rather than // transformed images by transforming the symbols themselves, rather than
// transforming addresses prior to querying symbols (the way it is typically // transforming addresses prior to querying symbols (the way it is typically
// done by Windows-native tools, including the DIA). // done by Windows-native tools, including the DIA).
#ifndef COMMON_WINDOWS_OMAP_H__ #ifndef COMMON_WINDOWS_OMAP_H_
#define COMMON_WINDOWS_OMAP_H__ #define COMMON_WINDOWS_OMAP_H_
#include "common/windows/omap_internal.h" #include "common/windows/omap_internal.h"
namespace google_breakpad { namespace google_breakpad {
// If the given session contains OMAP data this extracts it, populating // If the given session contains OMAP data this extracts it, populating
// |omap_data|, and then disabling automatic translation for the session. // |omap_data|, and then disabling automatic translation for the session.
// OMAP data is present in the PDB if |omap_data| is not empty. This returns // OMAP data is present in the PDB if |omap_data| is not empty. This returns
// true on success, false otherwise. // true on success, false otherwise.
bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session, bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session,
OmapData* omap_data); OmapData* omap_data);
// Given raw OMAP data builds an ImageMap. This can be used to query individual // Given raw OMAP data builds an ImageMap. This can be used to query individual
// image ranges using MapAddressRange. // image ranges using MapAddressRange.
// |omap_data|| is the OMAP data extracted from the PDB. // |omap_data|| is the OMAP data extracted from the PDB.
// |image_map| will be populated with a description of the image mapping. If // |image_map| will be populated with a description of the image mapping. If
// |omap_data| is empty then this will also be empty. // |omap_data| is empty then this will also be empty.
void BuildImageMap(const OmapData& omap_data, ImageMap* image_map); void BuildImageMap(const OmapData& omap_data, ImageMap* image_map);
// Given an address range in the original image space determines how exactly it // Given an address range in the original image space determines how exactly it
// has been tranformed. // has been tranformed.
// |omap_data| is the OMAP data extracted from the PDB, which must not be // |omap_data| is the OMAP data extracted from the PDB, which must not be
// empty. // empty.
// |original_range| is the address range in the original image being queried. // |original_range| is the address range in the original image being queried.
// |mapped_ranges| will be populated with a full description of the mapping. // |mapped_ranges| will be populated with a full description of the mapping.
// They may be disjoint in the transformed image so a vector is needed to // They may be disjoint in the transformed image so a vector is needed to
// fully represent the mapping. This will be appended to if it is not // fully represent the mapping. This will be appended to if it is not
// empty. If |omap_data| is empty then |mapped_ranges| will simply be // empty. If |omap_data| is empty then |mapped_ranges| will simply be
// populated with a copy of |original_range| (the identity transform). // populated with a copy of |original_range| (the identity transform).
void MapAddressRange(const ImageMap& image_map, void MapAddressRange(const ImageMap& image_map,
const AddressRange& original_range, const AddressRange& original_range,
AddressRangeVector* mapped_ranges); AddressRangeVector* mapped_ranges);
} // namespace google_breakpad } // namespace google_breakpad
#endif // COMMON_WINDOWS_OMAP_H__ #endif // COMMON_WINDOWS_OMAP_H_

View file

@ -1,137 +1,137 @@
// Copyright 2013 Google Inc. All rights reserved. // Copyright 2013 Google Inc. All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Declares internal implementation details for functionality in omap.h and // Declares internal implementation details for functionality in omap.h and
// omap.cc. // omap.cc.
#ifndef COMMON_WINDOWS_OMAP_INTERNAL_H__ #ifndef COMMON_WINDOWS_OMAP_INTERNAL_H_
#define COMMON_WINDOWS_OMAP_INTERNAL_H__ #define COMMON_WINDOWS_OMAP_INTERNAL_H_
#include <windows.h> #include <windows.h>
#include <dia2.h> #include <dia2.h>
#include <vector> #include <vector>
namespace google_breakpad { namespace google_breakpad {
// The OMAP struct is defined by debughlp.h, which doesn't play nicely with // The OMAP struct is defined by debughlp.h, which doesn't play nicely with
// imagehlp.h. We simply redefine it. // imagehlp.h. We simply redefine it.
struct OMAP { struct OMAP {
DWORD rva; DWORD rva;
DWORD rvaTo; DWORD rvaTo;
}; };
static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure."); static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure.");
typedef std::vector<OMAP> OmapTable; typedef std::vector<OMAP> OmapTable;
// This contains the OMAP data extracted from an image. // This contains the OMAP data extracted from an image.
struct OmapData { struct OmapData {
// The table of OMAP entries describing the transformation from the // The table of OMAP entries describing the transformation from the
// original image to the transformed image. // original image to the transformed image.
OmapTable omap_from; OmapTable omap_from;
// The table of OMAP entries describing the transformation from the // The table of OMAP entries describing the transformation from the
// instrumented image to the original image. // instrumented image to the original image.
OmapTable omap_to; OmapTable omap_to;
// The length of the original untransformed image. // The length of the original untransformed image.
DWORD length_original; DWORD length_original;
OmapData() : length_original(0) { } OmapData() : length_original(0) { }
}; };
// This represents a range of addresses in an image. // This represents a range of addresses in an image.
struct AddressRange { struct AddressRange {
DWORD rva; DWORD rva;
DWORD length; DWORD length;
AddressRange() : rva(0), length(0) { } AddressRange() : rva(0), length(0) { }
AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { } AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { }
// Returns the end address of this range. // Returns the end address of this range.
DWORD end() const { return rva + length; } DWORD end() const { return rva + length; }
// Addreses only compare as less-than or greater-than if they are not // Addreses only compare as less-than or greater-than if they are not
// overlapping. Otherwise, they compare equal. // overlapping. Otherwise, they compare equal.
int Compare(const AddressRange& rhs) const; int Compare(const AddressRange& rhs) const;
bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; } bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; }
bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; } bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; }
// Equality operators compare exact values. // Equality operators compare exact values.
bool operator==(const AddressRange& rhs) const { bool operator==(const AddressRange& rhs) const {
return rva == rhs.rva && length == rhs.length; return rva == rhs.rva && length == rhs.length;
} }
bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); } bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); }
}; };
typedef std::vector<AddressRange> AddressRangeVector; typedef std::vector<AddressRange> AddressRangeVector;
// This represents an address range in an original image, and its corresponding // This represents an address range in an original image, and its corresponding
// range in the transformed image. // range in the transformed image.
struct MappedRange { struct MappedRange {
// An address in the original image. // An address in the original image.
DWORD rva_original; DWORD rva_original;
// The corresponding addresses in the transformed image. // The corresponding addresses in the transformed image.
DWORD rva_transformed; DWORD rva_transformed;
// The length of the address range. // The length of the address range.
DWORD length; DWORD length;
// It is possible for code to be injected into a transformed image, for which // It is possible for code to be injected into a transformed image, for which
// there is no corresponding code in the original image. If this range of // there is no corresponding code in the original image. If this range of
// transformed image is immediately followed by such injected code we maintain // transformed image is immediately followed by such injected code we maintain
// a record of its length here. // a record of its length here.
DWORD injected; DWORD injected;
// It is possible for code to be removed from the original image. This happens // It is possible for code to be removed from the original image. This happens
// for things like padding between blocks. There is no actual content lost, // for things like padding between blocks. There is no actual content lost,
// but the spacing between items may be lost. This keeps track of any removed // but the spacing between items may be lost. This keeps track of any removed
// content immediately following the |original| range. // content immediately following the |original| range.
DWORD removed; DWORD removed;
}; };
// A vector of mapped ranges is used as a more useful representation of // A vector of mapped ranges is used as a more useful representation of
// OMAP data. // OMAP data.
typedef std::vector<MappedRange> Mapping; typedef std::vector<MappedRange> Mapping;
// Used as a secondary search structure accompanying a Mapping. // Used as a secondary search structure accompanying a Mapping.
struct EndpointIndex { struct EndpointIndex {
DWORD endpoint; DWORD endpoint;
size_t index; size_t index;
}; };
typedef std::vector<EndpointIndex> EndpointIndexMap; typedef std::vector<EndpointIndex> EndpointIndexMap;
// An ImageMap is vector of mapped ranges, plus a secondary index into it for // An ImageMap is vector of mapped ranges, plus a secondary index into it for
// doing interval searches. (An interval tree would also work, but is overkill // doing interval searches. (An interval tree would also work, but is overkill
// because we don't need insertion and deletion.) // because we don't need insertion and deletion.)
struct ImageMap { struct ImageMap {
// This is a description of the mapping between original and transformed // This is a description of the mapping between original and transformed
// image, sorted by addresses in the original image. // image, sorted by addresses in the original image.
Mapping mapping; Mapping mapping;
// For all interval endpoints in |mapping| this stores the minimum index of // For all interval endpoints in |mapping| this stores the minimum index of
// an interval in |mapping| that contains the endpoint. Useful for doing // an interval in |mapping| that contains the endpoint. Useful for doing
// interval intersection queries. // interval intersection queries.
EndpointIndexMap endpoint_index_map; EndpointIndexMap endpoint_index_map;
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // COMMON_WINDOWS_OMAP_INTERNAL_H__ #endif // COMMON_WINDOWS_OMAP_INTERNAL_H_

View file

@ -74,7 +74,7 @@ enum UnwindOperationCodes {
UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */ UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */
UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */ UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */
UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */ UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */
//XXX: these are missing from MSDN! // XXX: these are missing from MSDN!
// See: http://www.osronline.com/ddkx/kmarch/64bitamd_4rs7.htm // See: http://www.osronline.com/ddkx/kmarch/64bitamd_4rs7.htm
UWOP_SAVE_XMM, UWOP_SAVE_XMM,
UWOP_SAVE_XMM_FAR, UWOP_SAVE_XMM_FAR,
@ -125,8 +125,19 @@ PDBSourceLineWriter::PDBSourceLineWriter() : output_(NULL) {
PDBSourceLineWriter::~PDBSourceLineWriter() { PDBSourceLineWriter::~PDBSourceLineWriter() {
} }
bool PDBSourceLineWriter::SetCodeFile(const wstring &exe_file) {
if (code_file_.empty()) {
code_file_ = exe_file;
return true;
}
// Setting a different code file path is an error. It is success only if the
// file paths are the same.
return exe_file == code_file_;
}
bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) { bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {
Close(); Close();
code_file_.clear();
if (FAILED(CoInitialize(NULL))) { if (FAILED(CoInitialize(NULL))) {
fprintf(stderr, "CoInitialize failed\n"); fprintf(stderr, "CoInitialize failed\n");
@ -140,6 +151,7 @@ bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {
StringFromGUID2(CLSID_DiaSource, classid, kGuidSize); StringFromGUID2(CLSID_DiaSource, classid, kGuidSize);
// vc80 uses bce36434-2c24-499e-bf49-8bd99b0eeb68. // vc80 uses bce36434-2c24-499e-bf49-8bd99b0eeb68.
// vc90 uses 4C41678E-887B-4365-A09E-925D28DB33C2. // vc90 uses 4C41678E-887B-4365-A09E-925D28DB33C2.
// vc100 uses B86AE24D-BF2F-4AC9-B5A2-34B14E4CE11D.
fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed " fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed "
"(msdia*.dll unregistered?)\n", classid); "(msdia*.dll unregistered?)\n", classid);
return false; return false;
@ -162,7 +174,8 @@ bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {
case ANY_FILE: case ANY_FILE:
if (FAILED(data_source->loadDataFromPdb(file.c_str()))) { if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {
if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) { if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {
fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n", file.c_str()); fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n",
file.c_str());
return false; return false;
} }
code_file_ = file; code_file_ = file;
@ -641,7 +654,7 @@ bool PDBSourceLineWriter::PrintFrameDataUsingEXE() {
unwind_rva, unwind_rva,
&img->LastRvaSection)); &img->LastRvaSection));
DWORD stack_size = 8; // minimal stack size is 8 for RIP DWORD stack_size = 8; // minimal stack size is 8 for RIP
DWORD rip_offset = 8; DWORD rip_offset = 8;
do { do {
for (UBYTE c = 0; c < unwind_info->count_of_codes; c++) { for (UBYTE c = 0; c < unwind_info->count_of_codes; c++) {
@ -674,12 +687,12 @@ bool PDBSourceLineWriter::PrintFrameDataUsingEXE() {
break; break;
case UWOP_SAVE_NONVOL: case UWOP_SAVE_NONVOL:
case UWOP_SAVE_XMM128: { case UWOP_SAVE_XMM128: {
c++; //skip slot with offset c++; // skip slot with offset
break; break;
} }
case UWOP_SAVE_NONVOL_FAR: case UWOP_SAVE_NONVOL_FAR:
case UWOP_SAVE_XMM128_FAR: { case UWOP_SAVE_XMM128_FAR: {
c += 2; //skip 2 slots with offset c += 2; // skip 2 slots with offset
break; break;
} }
case UWOP_PUSH_MACHFRAME: { case UWOP_PUSH_MACHFRAME: {
@ -832,7 +845,7 @@ bool PDBSourceLineWriter::FindPEFile() {
CComBSTR symbols_file; CComBSTR symbols_file;
if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) { if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) {
wstring file(symbols_file); wstring file(symbols_file);
// Look for an EXE or DLL file. // Look for an EXE or DLL file.
const wchar_t *extensions[] = { L"exe", L"dll" }; const wchar_t *extensions[] = { L"exe", L"dll" };
for (int i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) { for (int i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) {
@ -1064,7 +1077,7 @@ bool PDBSourceLineWriter::WriteMap(FILE *map_file) {
// This is not a critical piece of the symbol file. // This is not a critical piece of the symbol file.
PrintPEInfo(); PrintPEInfo();
ret = ret && ret = ret &&
PrintSourceFiles() && PrintSourceFiles() &&
PrintFunctions() && PrintFunctions() &&
PrintFrameData(); PrintFrameData();
@ -1206,8 +1219,7 @@ bool PDBSourceLineWriter::GetPEInfo(PEModuleInfo *info) {
if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) { if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
// 64-bit PE file. // 64-bit PE file.
SizeOfImage = opt->SizeOfImage; SizeOfImage = opt->SizeOfImage;
} } else {
else {
// 32-bit PE file. // 32-bit PE file.
SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage; SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage;
} }

View file

@ -30,8 +30,8 @@
// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output // PDBSourceLineWriter uses a pdb file produced by Visual C++ to output
// a line/address map for use with BasicSourceLineResolver. // a line/address map for use with BasicSourceLineResolver.
#ifndef _PDB_SOURCE_LINE_WRITER_H__ #ifndef COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
#define _PDB_SOURCE_LINE_WRITER_H__ #define COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
#include <atlcomcli.h> #include <atlcomcli.h>
@ -101,10 +101,14 @@ class PDBSourceLineWriter {
// Returns true on success. // Returns true on success.
bool Open(const wstring &file, FileFormat format); bool Open(const wstring &file, FileFormat format);
// Locates the pdb file for the given executable (exe or dll) file, // Sets the code file full path. This is optional for 32-bit modules. It is
// and opens it. If there is already a pdb file open, it is automatically // also optional for 64-bit modules when there is an executable file stored
// closed. Returns true on success. // in the same directory as the PDB file. It is only required for 64-bit
bool OpenExecutable(const wstring &exe_file); // modules when the executable file is not in the same location as the PDB
// file and it must be called after Open() and before WriteMap().
// If Open() was called for an executable file, then it is an error to call
// SetCodeFile() with a different file path and it will return false.
bool SetCodeFile(const wstring &exe_file);
// Writes a map file from the current pdb file to the given file stream. // Writes a map file from the current pdb file to the given file stream.
// Returns true on success. // Returns true on success.
@ -179,12 +183,12 @@ class PDBSourceLineWriter {
// and an ID is stored for it, or false if it has not. // and an ID is stored for it, or false if it has not.
bool FileIDIsCached(const wstring &file) { bool FileIDIsCached(const wstring &file) {
return unique_files_.find(file) != unique_files_.end(); return unique_files_.find(file) != unique_files_.end();
}; }
// Cache this filename and ID for later reuse. // Cache this filename and ID for later reuse.
void CacheFileID(const wstring &file, DWORD id) { void CacheFileID(const wstring &file, DWORD id) {
unique_files_[file] = id; unique_files_[file] = id;
}; }
// Store this ID in the cache as a duplicate for this filename. // Store this ID in the cache as a duplicate for this filename.
void StoreDuplicateFileID(const wstring &file, DWORD id) { void StoreDuplicateFileID(const wstring &file, DWORD id) {
@ -193,7 +197,7 @@ class PDBSourceLineWriter {
// map this id to the previously seen one // map this id to the previously seen one
file_ids_[id] = iter->second; file_ids_[id] = iter->second;
} }
}; }
// Given a file's unique ID, return the ID that should be used to // Given a file's unique ID, return the ID that should be used to
// reference it. There may be multiple files with identical filenames // reference it. There may be multiple files with identical filenames
@ -204,7 +208,7 @@ class PDBSourceLineWriter {
if (iter == file_ids_.end()) if (iter == file_ids_.end())
return id; return id;
return iter->second; return iter->second;
}; }
// Find the PE file corresponding to the loaded PDB file, and // Find the PE file corresponding to the loaded PDB file, and
// set the code_file_ member. Returns false on failure. // set the code_file_ member. Returns false on failure.
@ -250,4 +254,4 @@ class PDBSourceLineWriter {
} // namespace google_breakpad } // namespace google_breakpad
#endif // _PDB_SOURCE_LINE_WRITER_H__ #endif // COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_

View file

@ -30,8 +30,8 @@
// string_utils-inl.h: Safer string manipulation on Windows, supporting // string_utils-inl.h: Safer string manipulation on Windows, supporting
// pre-MSVC8 environments. // pre-MSVC8 environments.
#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__ #ifndef COMMON_WINDOWS_STRING_UTILS_INL_H_
#define COMMON_WINDOWS_STRING_UTILS_INL_H__ #define COMMON_WINDOWS_STRING_UTILS_INL_H_
#include <stdarg.h> #include <stdarg.h>
#include <wchar.h> #include <wchar.h>
@ -139,4 +139,4 @@ inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination,
} // namespace google_breakpad } // namespace google_breakpad
#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__ #endif // COMMON_WINDOWS_STRING_UTILS_INL_H_

View file

@ -113,10 +113,12 @@ MSSymbolServerConverter::MSSymbolServerConverter(
assert(symbol_servers.size() > 0); assert(symbol_servers.size() > 0);
#if !defined(NDEBUG)
// These are characters that are interpreted as having special meanings in // These are characters that are interpreted as having special meanings in
// symbol_path_. // symbol_path_.
const char *kInvalidCharacters = "*;"; const char kInvalidCharacters[] = "*;";
assert(local_cache.find_first_of(kInvalidCharacters) == string::npos); assert(local_cache.find_first_of(kInvalidCharacters) == string::npos);
#endif // !defined(NDEBUG)
for (vector<string>::const_iterator symbol_server = symbol_servers.begin(); for (vector<string>::const_iterator symbol_server = symbol_servers.begin();
symbol_server != symbol_servers.end(); symbol_server != symbol_servers.end();
@ -183,7 +185,7 @@ class AutoSymSrv {
// are supported by calling Delete(). // are supported by calling Delete().
class AutoDeleter { class AutoDeleter {
public: public:
AutoDeleter(const string &path) : path_(path) {} explicit AutoDeleter(const string &path) : path_(path) {}
~AutoDeleter() { ~AutoDeleter() {
int error; int error;
@ -213,18 +215,20 @@ class AutoDeleter {
}; };
MSSymbolServerConverter::LocateResult MSSymbolServerConverter::LocateResult
MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing, MSSymbolServerConverter::LocateFile(const string &debug_or_code_file,
string *symbol_file) { const string &debug_or_code_id,
assert(symbol_file); const string &version,
symbol_file->clear(); string *file_name) {
assert(file_name);
file_name->clear();
GUIDOrSignatureIdentifier identifier; GUIDOrSignatureIdentifier identifier;
if (!identifier.InitializeFromString(missing.debug_identifier)) { if (!identifier.InitializeFromString(debug_or_code_id)) {
fprintf(stderr, fprintf(stderr,
"LocateSymbolFile: Unparseable debug_identifier for %s %s %s\n", "LocateFile: Unparseable identifier for %s %s %s\n",
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
@ -233,22 +237,22 @@ MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
if (!symsrv.Initialize(process, if (!symsrv.Initialize(process,
const_cast<char *>(symbol_path_.c_str()), const_cast<char *>(symbol_path_.c_str()),
false)) { false)) {
fprintf(stderr, "LocateSymbolFile: SymInitialize: error %d for %s %s %s\n", fprintf(stderr, "LocateFile: SymInitialize: error %d for %s %s %s\n",
GetLastError(), GetLastError(),
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
if (!SymRegisterCallback64(process, SymCallback, if (!SymRegisterCallback64(process, SymCallback,
reinterpret_cast<ULONG64>(this))) { reinterpret_cast<ULONG64>(this))) {
fprintf(stderr, fprintf(stderr,
"LocateSymbolFile: SymRegisterCallback64: error %d for %s %s %s\n", "LocateFile: SymRegisterCallback64: error %d for %s %s %s\n",
GetLastError(), GetLastError(),
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
@ -267,7 +271,7 @@ MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
char path[MAX_PATH]; char path[MAX_PATH];
if (!SymFindFileInPath( if (!SymFindFileInPath(
process, NULL, process, NULL,
const_cast<char *>(missing.debug_file.c_str()), const_cast<char *>(debug_or_code_file.c_str()),
const_cast<void *>(identifier.guid_or_signature_pointer()), const_cast<void *>(identifier.guid_or_signature_pointer()),
identifier.age(), 0, identifier.age(), 0,
identifier.type() == GUIDOrSignatureIdentifier::TYPE_GUID ? identifier.type() == GUIDOrSignatureIdentifier::TYPE_GUID ?
@ -286,11 +290,11 @@ MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
// This is an authoritiative file-not-found message. // This is an authoritiative file-not-found message.
if (fail_not_found_) { if (fail_not_found_) {
fprintf(stderr, fprintf(stderr,
"LocateSymbolFile: SymFindFileInPath: LOCATE_NOT_FOUND error " "LocateFile: SymFindFileInPath: LOCATE_NOT_FOUND error "
"for %s %s %s\n", "for %s %s %s\n",
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_NOT_FOUND; return LOCATE_NOT_FOUND;
} }
@ -299,14 +303,17 @@ MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
} }
fprintf(stderr, fprintf(stderr,
"LocateSymbolFile: SymFindFileInPath: error %d for %s %s %s\n", "LocateFile: SymFindFileInPath: error %d for %s %s %s\n",
error, error,
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
// Making sure path is null-terminated.
path[MAX_PATH - 1] = '\0';
// The AutoDeleter ensures that the file is only kept when returning // The AutoDeleter ensures that the file is only kept when returning
// LOCATE_SUCCESS. // LOCATE_SUCCESS.
AutoDeleter deleter(path); AutoDeleter deleter(path);
@ -314,20 +321,37 @@ MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
// Do the cleanup here even though it will happen when symsrv goes out of // Do the cleanup here even though it will happen when symsrv goes out of
// scope, to allow it to influence the return value. // scope, to allow it to influence the return value.
if (!symsrv.Cleanup()) { if (!symsrv.Cleanup()) {
fprintf(stderr, "LocateSymbolFile: SymCleanup: error %d for %s %s %s\n", fprintf(stderr, "LocateFile: SymCleanup: error %d for %s %s %s\n",
GetLastError(), GetLastError(),
missing.debug_file.c_str(), debug_or_code_file.c_str(),
missing.debug_identifier.c_str(), debug_or_code_id.c_str(),
missing.version.c_str()); version.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
deleter.Release(); deleter.Release();
*symbol_file = path; printf("Downloaded: %s\n", path);
*file_name = path;
return LOCATE_SUCCESS; return LOCATE_SUCCESS;
} }
MSSymbolServerConverter::LocateResult
MSSymbolServerConverter::LocatePEFile(const MissingSymbolInfo &missing,
string *pe_file) {
return LocateFile(missing.code_file, missing.code_identifier,
missing.version, pe_file);
}
MSSymbolServerConverter::LocateResult
MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
string *symbol_file) {
return LocateFile(missing.debug_file, missing.debug_identifier,
missing.version, symbol_file);
}
// static // static
BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process, BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process,
ULONG action, ULONG action,
@ -341,7 +365,7 @@ BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process,
IMAGEHLP_CBA_EVENT *cba_event = IMAGEHLP_CBA_EVENT *cba_event =
reinterpret_cast<IMAGEHLP_CBA_EVENT *>(data); reinterpret_cast<IMAGEHLP_CBA_EVENT *>(data);
// Put the string into a string object to be able to use string::find // Put the string into a string object to be able to use string::find
// for substring matching. This is important because the not-found // for substring matching. This is important because the not-found
// message does not use the entire string but is appended to the URL // message does not use the entire string but is appended to the URL
// that SymSrv attempted to retrieve. // that SymSrv attempted to retrieve.
@ -398,7 +422,7 @@ BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process,
// static // static
BOOL CALLBACK MSSymbolServerConverter::SymFindFileInPathCallback( BOOL CALLBACK MSSymbolServerConverter::SymFindFileInPathCallback(
char *filename, void *context) { const char *filename, void *context) {
// FALSE ends the search, indicating that the located symbol file is // FALSE ends the search, indicating that the located symbol file is
// satisfactory. // satisfactory.
return FALSE; return FALSE;
@ -408,8 +432,10 @@ MSSymbolServerConverter::LocateResult
MSSymbolServerConverter::LocateAndConvertSymbolFile( MSSymbolServerConverter::LocateAndConvertSymbolFile(
const MissingSymbolInfo &missing, const MissingSymbolInfo &missing,
bool keep_symbol_file, bool keep_symbol_file,
bool keep_pe_file,
string *converted_symbol_file, string *converted_symbol_file,
string *symbol_file) { string *symbol_file,
string *out_pe_file) {
assert(converted_symbol_file); assert(converted_symbol_file);
converted_symbol_file->clear(); converted_symbol_file->clear();
if (symbol_file) { if (symbol_file) {
@ -426,11 +452,26 @@ MSSymbolServerConverter::LocateAndConvertSymbolFile(
*symbol_file = pdb_file; *symbol_file = pdb_file;
} }
// The conversion of a symbol file for a Windows 64-bit module requires
// loading of the executable file. If there is no executable file, convert
// using only the PDB file. Without an executable file, the conversion will
// fail for 64-bit modules but it should succeed for 32-bit modules.
string pe_file;
result = LocatePEFile(missing, &pe_file);
if (result != LOCATE_SUCCESS) {
fprintf(stderr, "WARNING: Could not download: %s\n", pe_file.c_str());
}
if (out_pe_file && keep_pe_file) {
*out_pe_file = pe_file;
}
// Conversion may fail because the file is corrupt. If a broken file is // Conversion may fail because the file is corrupt. If a broken file is
// kept in the local cache, LocateSymbolFile will not hit the network again // kept in the local cache, LocateSymbolFile will not hit the network again
// to attempt to locate it. To guard against problems like this, the // to attempt to locate it. To guard against problems like this, the
// symbol file in the local cache will be removed if conversion fails. // symbol file in the local cache will be removed if conversion fails.
AutoDeleter pdb_deleter(pdb_file); AutoDeleter pdb_deleter(pdb_file);
AutoDeleter pe_deleter(pe_file);
// Be sure that it's a .pdb file, since we'll be replacing .pdb with .sym // Be sure that it's a .pdb file, since we'll be replacing .pdb with .sym
// for the converted file's name. // for the converted file's name.
@ -438,19 +479,7 @@ MSSymbolServerConverter::LocateAndConvertSymbolFile(
// strcasecmp is called _stricmp here. // strcasecmp is called _stricmp here.
if (_stricmp(pdb_extension.c_str(), ".pdb") != 0) { if (_stricmp(pdb_extension.c_str(), ".pdb") != 0) {
fprintf(stderr, "LocateAndConvertSymbolFile: " fprintf(stderr, "LocateAndConvertSymbolFile: "
"LocateSymbolFile: no .pdb extension for %s %s %s %s\n", "no .pdb extension for %s %s %s %s\n",
missing.debug_file.c_str(),
missing.debug_identifier.c_str(),
missing.version.c_str(),
pdb_file.c_str());
return LOCATE_FAILURE;
}
// PDBSourceLineWriter wants the filename as a wstring, so convert it.
wstring pdb_file_w;
if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) {
fprintf(stderr, "LocateAndConvertSymbolFile: "
"WindowsStringUtils::safe_mbstowcs failed for %s %s %s %s\n",
missing.debug_file.c_str(), missing.debug_file.c_str(),
missing.debug_identifier.c_str(), missing.debug_identifier.c_str(),
missing.version.c_str(), missing.version.c_str(),
@ -459,15 +488,36 @@ MSSymbolServerConverter::LocateAndConvertSymbolFile(
} }
PDBSourceLineWriter writer; PDBSourceLineWriter writer;
if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) { wstring pe_file_w;
fprintf(stderr, "LocateAndConvertSymbolFile: " if (!WindowsStringUtils::safe_mbstowcs(pe_file, &pe_file_w)) {
"PDBSourceLineWriter::Open failed for %s %s %s %ws\n", fprintf(stderr,
missing.debug_file.c_str(), "LocateAndConvertSymbolFile: "
missing.debug_identifier.c_str(), "WindowsStringUtils::safe_mbstowcs failed for %s\n",
missing.version.c_str(), pe_file.c_str());
return LOCATE_FAILURE;
}
wstring pdb_file_w;
if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) {
fprintf(stderr,
"LocateAndConvertSymbolFile: "
"WindowsStringUtils::safe_mbstowcs failed for %s\n",
pdb_file_w.c_str()); pdb_file_w.c_str());
return LOCATE_FAILURE; return LOCATE_FAILURE;
} }
if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) {
fprintf(stderr,
"ERROR: PDBSourceLineWriter::Open failed for %s %s %s %ws\n",
missing.debug_file.c_str(), missing.debug_identifier.c_str(),
missing.version.c_str(), pdb_file_w.c_str());
return LOCATE_FAILURE;
}
if (!writer.SetCodeFile(pe_file_w)) {
fprintf(stderr,
"ERROR: PDBSourceLineWriter::SetCodeFile failed for %s %s %s %ws\n",
missing.debug_file.c_str(), missing.debug_identifier.c_str(),
missing.version.c_str(), pe_file_w.c_str());
return LOCATE_FAILURE;
}
*converted_symbol_file = pdb_file.substr(0, pdb_file.length() - 4) + ".sym"; *converted_symbol_file = pdb_file.substr(0, pdb_file.length() - 4) + ".sym";
@ -514,6 +564,10 @@ MSSymbolServerConverter::LocateAndConvertSymbolFile(
pdb_deleter.Release(); pdb_deleter.Release();
} }
if (keep_pe_file) {
pe_deleter.Release();
}
sym_deleter.Release(); sym_deleter.Release();
return LOCATE_SUCCESS; return LOCATE_SUCCESS;

View file

@ -0,0 +1,46 @@
# Copyright 2013 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
'includes': [
'../../../build/common.gypi',
],
'targets': [
{
'target_name': 'ms_symbol_server_converter',
'type': 'static_library',
'msvs_guid': '1463C4CD-23FC-4DE9-BFDE-283338200157',
'sources': [
'ms_symbol_server_converter.cc',
],
'dependencies': [
'../../../common/windows/common_windows.gyp:common_windows_lib',
],
},
],
}

View file

@ -55,16 +55,15 @@
// attempting to load symbols from their server (.reload). // attempting to load symbols from their server (.reload).
// //
// This code has been tested with dbghelp.dll 6.5.3.7 and symsrv.dll 6.5.3.8, // This code has been tested with dbghelp.dll 6.5.3.7 and symsrv.dll 6.5.3.8,
// included with Microsoft Visual Studio 8 in Common7/IDE. This has also // included with Microsoft Visual Studio 8 in Common7/IDE. This has also been
// been tested with dbghelp.dll and symsrv.dll 6.6.7.5, included with that // tested with dbghelp.dll and symsrv.dll versions 6.6.7.5 and 6.12.2.633,
// version of Debugging Tools for Windows, available at // included with the same versions of Debugging Tools for Windows, available at
// http://www.microsoft.com/whdc/devtools/debugging/ . // http://www.microsoft.com/whdc/devtools/debugging/ .
// //
// Author: Mark Mentovai // Author: Mark Mentovai
#ifndef TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_
#ifndef MS_SYMBOL_SERVER_CONVERTER_H__ #define TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_
#define MS_SYMBOL_SERVER_CONVERTER_H__
#include <Windows.h> #include <Windows.h>
@ -145,6 +144,13 @@ class MSSymbolServerConverter {
MSSymbolServerConverter(const string &local_cache, MSSymbolServerConverter(const string &local_cache,
const vector<string> &symbol_servers); const vector<string> &symbol_servers);
// Locates the PE file (DLL or EXE) specified by the identifying information
// in |missing|, by checking the symbol stores identified when the object
// was created. When returning LOCATE_SUCCESS, pe_file is set to
// the pathname of the decompressed PE file as it is stored in the
// local cache.
LocateResult LocatePEFile(const MissingSymbolInfo &missing, string *pe_file);
// Locates the symbol file specified by the identifying information in // Locates the symbol file specified by the identifying information in
// |missing|, by checking the symbol stores identified when the object // |missing|, by checking the symbol stores identified when the object
// was created. When returning LOCATE_SUCCESS, symbol_file is set to // was created. When returning LOCATE_SUCCESS, symbol_file is set to
@ -159,16 +165,28 @@ class MSSymbolServerConverter {
// value of LocateSymbolFile, or if LocateSymbolFile succeeds but // value of LocateSymbolFile, or if LocateSymbolFile succeeds but
// conversion fails, returns LOCATE_FAILURE. The pathname to the // conversion fails, returns LOCATE_FAILURE. The pathname to the
// pdb file and to the converted symbol file are returned in // pdb file and to the converted symbol file are returned in
// converted_symbol_file and symbol_file. symbol_file is optional and // |converted_symbol_file|, |symbol_file|, and |pe_file|. |symbol_file| and
// may be NULL. If only the converted symbol file is desired, set // |pe_file| are optional and may be NULL. If only the converted symbol file
// keep_symbol_file to false to indicate that the original symbol file // is desired, set |keep_symbol_file| and |keep_pe_file| to false to indicate
// (pdb) should be deleted after conversion. // that the original symbol file (pdb) and executable file (exe, dll) should
// be deleted after conversion.
LocateResult LocateAndConvertSymbolFile(const MissingSymbolInfo &missing, LocateResult LocateAndConvertSymbolFile(const MissingSymbolInfo &missing,
bool keep_symbol_file, bool keep_symbol_file,
bool keep_pe_file,
string *converted_symbol_file, string *converted_symbol_file,
string *symbol_file); string *symbol_file,
string *pe_file);
private: private:
// Locates the PDB or PE file (DLL or EXE) specified by the identifying
// information in |debug_or_code_file| and |debug_or_code_id|, by checking
// the symbol stores identified when the object was created. When
// returning LOCATE_SUCCESS, file_name is set to the pathname of the
// decompressed PDB or PE file file as it is stored in the local cache.
LocateResult LocateFile(const string &debug_or_code_file,
const string &debug_or_code_id,
const string &version, string *file_name);
// Called by various SymSrv functions to report status as progress is made // Called by various SymSrv functions to report status as progress is made
// and to allow the callback to influence processing. Messages sent to this // and to allow the callback to influence processing. Messages sent to this
// callback can be used to distinguish between the various failure modes // callback can be used to distinguish between the various failure modes
@ -181,7 +199,7 @@ class MSSymbolServerConverter {
// SymFindFileInPath actually seems to accept NULL for a callback function // SymFindFileInPath actually seems to accept NULL for a callback function
// and behave properly for our needs in that case, but the documentation // and behave properly for our needs in that case, but the documentation
// doesn't mention it, so this little callback is provided. // doesn't mention it, so this little callback is provided.
static BOOL CALLBACK SymFindFileInPathCallback(char *filename, static BOOL CALLBACK SymFindFileInPathCallback(const char *filename,
void *context); void *context);
// The search path used by SymSrv, built based on the arguments to the // The search path used by SymSrv, built based on the arguments to the
@ -198,4 +216,4 @@ class MSSymbolServerConverter {
} // namespace google_breakpad } // namespace google_breakpad
#endif // MS_SYMBOL_SERVER_CONVERTER_H__ #endif // TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_

View file

@ -1,319 +1,368 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="utf-8"?>
<VisualStudioProject <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
ProjectType="Visual C++" <ItemGroup Label="ProjectConfigurations">
Version="8.00" <ProjectConfiguration Include="Debug|Win32">
Name="ms_symbol_server_converter" <Configuration>Debug</Configuration>
ProjectGUID="{1463C4CD-23FC-4DE9-BFDE-283338200157}" <Platform>Win32</Platform>
> </ProjectConfiguration>
<Platforms> <ProjectConfiguration Include="Debug|x64">
<Platform <Configuration>Debug</Configuration>
Name="Win32" <Platform>x64</Platform>
/> </ProjectConfiguration>
</Platforms> <ProjectConfiguration Include="Purify|Win32">
<ToolFiles> <Configuration>Purify</Configuration>
</ToolFiles> <Platform>Win32</Platform>
<Configurations> </ProjectConfiguration>
<Configuration <ProjectConfiguration Include="Purify|x64">
Name="Debug|Win32" <Configuration>Purify</Configuration>
OutputDirectory="$(SolutionDir)$(ConfigurationName)" <Platform>x64</Platform>
IntermediateDirectory="$(ConfigurationName)" </ProjectConfiguration>
ConfigurationType="4" <ProjectConfiguration Include="Release|Win32">
> <Configuration>Release</Configuration>
<Tool <Platform>Win32</Platform>
Name="VCPreBuildEventTool" </ProjectConfiguration>
/> <ProjectConfiguration Include="Release|x64">
<Tool <Configuration>Release</Configuration>
Name="VCCustomBuildTool" <Platform>x64</Platform>
/> </ProjectConfiguration>
<Tool </ItemGroup>
Name="VCXMLDataGeneratorTool" <PropertyGroup Label="Globals">
/> <ProjectGuid>{1463C4CD-23FC-4DE9-BFDE-283338200157}</ProjectGuid>
<Tool <Keyword>Win32Proj</Keyword>
Name="VCWebServiceProxyGeneratorTool" <RootNamespace>ms_symbol_server_converter</RootNamespace>
/> <IgnoreWarnCompileDuplicatedFilename>true</IgnoreWarnCompileDuplicatedFilename>
<Tool </PropertyGroup>
Name="VCMIDLTool" <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
/> <PropertyGroup Label="Configuration">
<Tool <CharacterSet>Unicode</CharacterSet>
Name="VCCLCompilerTool" <ConfigurationType>StaticLibrary</ConfigurationType>
Optimization="0" </PropertyGroup>
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" <ImportGroup Label="ExtensionSettings"/>
MinimalRebuild="true" <ImportGroup Label="PropertySheets">
BasicRuntimeChecks="3" <Import Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props"/>
RuntimeLibrary="3" </ImportGroup>
WarningLevel="3" <PropertyGroup Label="UserMacros"/>
Detect64BitPortabilityProblems="true" <PropertyGroup>
DebugInformationFormat="4" <ExecutablePath>$(ExecutablePath);$(MSBuildProjectDirectory)\..\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\..\third_party\python_26\</ExecutablePath>
/> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<Tool <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir>
Name="VCManagedResourceCompilerTool" <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Purify|Win32'">false</LinkIncremental>
/> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Purify|x64'">false</LinkIncremental>
<Tool <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
Name="VCResourceCompilerTool" <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
/> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<Tool <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
Name="VCPreLinkEventTool" <TargetName>$(ProjectName)</TargetName>
/> <TargetPath>$(OutDir)lib\$(ProjectName)$(TargetExt)</TargetPath>
<Tool </PropertyGroup>
Name="VCLibrarianTool" <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
AdditionalDependencies="dbghelp.lib diaguids.lib" <ClCompile>
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
/> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
<Tool <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
Name="VCALinkTool" <BufferSecurityCheck>true</BufferSecurityCheck>
/> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<Tool <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
Name="VCXDCMakeTool" <ExceptionHandling>false</ExceptionHandling>
/> <FunctionLevelLinking>true</FunctionLevelLinking>
<Tool <MinimalRebuild>false</MinimalRebuild>
Name="VCBscMakeTool" <Optimization>Disabled</Optimization>
/> <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Tool <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
Name="VCFxCopTool" <RuntimeTypeInfo>false</RuntimeTypeInfo>
/> <TreatWarningAsError>true</TreatWarningAsError>
<Tool <WarningLevel>Level4</WarningLevel>
Name="VCPostBuildEventTool" </ClCompile>
/> <Lib>
</Configuration> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<Configuration <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
Name="Release|Win32" <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
OutputDirectory="$(SolutionDir)$(ConfigurationName)" </Lib>
IntermediateDirectory="$(ConfigurationName)" <Link>
ConfigurationType="4" <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<Tool <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
Name="VCPreBuildEventTool" <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
/> <FixedBaseAddress>false</FixedBaseAddress>
<Tool <GenerateDebugInformation>true</GenerateDebugInformation>
Name="VCCustomBuildTool" <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
/> <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
<Tool <SubSystem>Console</SubSystem>
Name="VCXMLDataGeneratorTool" <TargetMachine>MachineX86</TargetMachine>
/> </Link>
<Tool <Midl>
Name="VCWebServiceProxyGeneratorTool" <DllDataFileName>dlldata.c</DllDataFileName>
/> <GenerateStublessProxies>true</GenerateStublessProxies>
<Tool <HeaderFileName>%(Filename).h</HeaderFileName>
Name="VCMIDLTool" <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
/> <OutputDirectory>$(IntDir)</OutputDirectory>
<Tool <ProxyFileName>%(Filename)_p.c</ProxyFileName>
Name="VCCLCompilerTool" <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." </Midl>
PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN" <ResourceCompile>
RuntimeLibrary="2" <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
WarningLevel="3" <Culture>0x0409</Culture>
Detect64BitPortabilityProblems="true" <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
DebugInformationFormat="3" </ResourceCompile>
/> </ItemDefinitionGroup>
<Tool <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
Name="VCManagedResourceCompilerTool" <ClCompile>
/> <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Tool <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
Name="VCResourceCompilerTool" <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
/> <BufferSecurityCheck>true</BufferSecurityCheck>
<Tool <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
Name="VCPreLinkEventTool" <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
/> <ExceptionHandling>false</ExceptionHandling>
<Tool <FunctionLevelLinking>true</FunctionLevelLinking>
Name="VCLibrarianTool" <MinimalRebuild>false</MinimalRebuild>
AdditionalDependencies="dbghelp.lib diaguids.lib" <Optimization>Disabled</Optimization>
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
/> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<Tool <RuntimeTypeInfo>false</RuntimeTypeInfo>
Name="VCALinkTool" <TreatWarningAsError>true</TreatWarningAsError>
/> <WarningLevel>Level4</WarningLevel>
<Tool </ClCompile>
Name="VCXDCMakeTool" <Lib>
/> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<Tool <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
Name="VCBscMakeTool" <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
/> </Lib>
<Tool <Link>
Name="VCFxCopTool" <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
/> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<Tool <AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
Name="VCPostBuildEventTool" <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
/> <FixedBaseAddress>false</FixedBaseAddress>
</Configuration> <GenerateDebugInformation>true</GenerateDebugInformation>
<Configuration <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
Name="DebugStaticCRT|Win32" <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
OutputDirectory="$(SolutionDir)$(ConfigurationName)" <SubSystem>Console</SubSystem>
IntermediateDirectory="$(ConfigurationName)" <TargetMachine>MachineX64</TargetMachine>
ConfigurationType="4" </Link>
> <Midl>
<Tool <DllDataFileName>dlldata.c</DllDataFileName>
Name="VCPreBuildEventTool" <GenerateStublessProxies>true</GenerateStublessProxies>
/> <HeaderFileName>%(Filename).h</HeaderFileName>
<Tool <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
Name="VCCustomBuildTool" <OutputDirectory>$(IntDir)</OutputDirectory>
/> <ProxyFileName>%(Filename)_p.c</ProxyFileName>
<Tool <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
Name="VCXMLDataGeneratorTool" </Midl>
/> <ResourceCompile>
<Tool <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
Name="VCWebServiceProxyGeneratorTool" <Culture>0x0409</Culture>
/> <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Tool </ResourceCompile>
Name="VCMIDLTool" </ItemDefinitionGroup>
/> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Purify|Win32'">
<Tool <ClCompile>
Name="VCCLCompilerTool" <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
Optimization="0" <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." <BufferSecurityCheck>true</BufferSecurityCheck>
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
MinimalRebuild="true" <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
BasicRuntimeChecks="3" <ExceptionHandling>false</ExceptionHandling>
RuntimeLibrary="1" <FunctionLevelLinking>true</FunctionLevelLinking>
WarningLevel="3" <MinimalRebuild>false</MinimalRebuild>
Detect64BitPortabilityProblems="true" <Optimization>MaxSpeed</Optimization>
DebugInformationFormat="4" <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
/> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<Tool <RuntimeTypeInfo>false</RuntimeTypeInfo>
Name="VCManagedResourceCompilerTool" <TreatWarningAsError>true</TreatWarningAsError>
/> <WarningLevel>Level4</WarningLevel>
<Tool </ClCompile>
Name="VCResourceCompilerTool" <Lib>
/> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<Tool <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
Name="VCPreLinkEventTool" <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
/> </Lib>
<Tool <Link>
Name="VCLibrarianTool" <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
AdditionalDependencies="dbghelp.lib diaguids.lib" <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
/> <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<Tool <FixedBaseAddress>false</FixedBaseAddress>
Name="VCALinkTool" <GenerateDebugInformation>true</GenerateDebugInformation>
/> <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
<Tool <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
Name="VCXDCMakeTool" <SubSystem>Console</SubSystem>
/> <TargetMachine>MachineX86</TargetMachine>
<Tool </Link>
Name="VCBscMakeTool" <Midl>
/> <DllDataFileName>dlldata.c</DllDataFileName>
<Tool <GenerateStublessProxies>true</GenerateStublessProxies>
Name="VCFxCopTool" <HeaderFileName>%(Filename).h</HeaderFileName>
/> <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
<Tool <OutputDirectory>$(IntDir)</OutputDirectory>
Name="VCPostBuildEventTool" <ProxyFileName>%(Filename)_p.c</ProxyFileName>
/> <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
</Configuration> </Midl>
<Configuration <ResourceCompile>
Name="ReleaseStaticCRT|Win32" <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
OutputDirectory="$(SolutionDir)$(ConfigurationName)" <Culture>0x0409</Culture>
IntermediateDirectory="$(ConfigurationName)" <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
ConfigurationType="4" </ResourceCompile>
> </ItemDefinitionGroup>
<Tool <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Purify|x64'">
Name="VCPreBuildEventTool" <ClCompile>
/> <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Tool <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
Name="VCCustomBuildTool" <BufferSecurityCheck>false</BufferSecurityCheck>
/> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<Tool <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
Name="VCXMLDataGeneratorTool" <ExceptionHandling>false</ExceptionHandling>
/> <FunctionLevelLinking>true</FunctionLevelLinking>
<Tool <MinimalRebuild>false</MinimalRebuild>
Name="VCWebServiceProxyGeneratorTool" <Optimization>Disabled</Optimization>
/> <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Tool <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
Name="VCMIDLTool" <RuntimeTypeInfo>false</RuntimeTypeInfo>
/> <TreatWarningAsError>true</TreatWarningAsError>
<Tool <WarningLevel>Level4</WarningLevel>
Name="VCCLCompilerTool" </ClCompile>
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." <Lib>
PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN" <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
RuntimeLibrary="0" <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
WarningLevel="3" <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
Detect64BitPortabilityProblems="true" </Lib>
DebugInformationFormat="3" <Link>
/> <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
<Tool <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
Name="VCManagedResourceCompilerTool" <AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
/> <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<Tool <EnableCOMDATFolding>false</EnableCOMDATFolding>
Name="VCResourceCompilerTool" <FixedBaseAddress>false</FixedBaseAddress>
/> <GenerateDebugInformation>true</GenerateDebugInformation>
<Tool <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
Name="VCPreLinkEventTool" <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
/> <SubSystem>Console</SubSystem>
<Tool <TargetMachine>MachineX64</TargetMachine>
Name="VCLibrarianTool" </Link>
AdditionalDependencies="dbghelp.lib diaguids.lib" <Midl>
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" <DllDataFileName>dlldata.c</DllDataFileName>
/> <GenerateStublessProxies>true</GenerateStublessProxies>
<Tool <HeaderFileName>%(Filename).h</HeaderFileName>
Name="VCALinkTool" <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
/> <OutputDirectory>$(IntDir)</OutputDirectory>
<Tool <ProxyFileName>%(Filename)_p.c</ProxyFileName>
Name="VCXDCMakeTool" <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
/> </Midl>
<Tool <ResourceCompile>
Name="VCBscMakeTool" <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
/> <Culture>0x0409</Culture>
<Tool <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
Name="VCFxCopTool" </ResourceCompile>
/> </ItemDefinitionGroup>
<Tool <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
Name="VCPostBuildEventTool" <ClCompile>
/> <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</Configuration> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
</Configurations> <BufferSecurityCheck>true</BufferSecurityCheck>
<References> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</References> <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<Files> <ExceptionHandling>false</ExceptionHandling>
<Filter <FunctionLevelLinking>true</FunctionLevelLinking>
Name="Source Files" <MinimalRebuild>false</MinimalRebuild>
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" <OmitFramePointers>true</OmitFramePointers>
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" <Optimization>MaxSpeed</Optimization>
> <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<File <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
RelativePath="..\..\..\common\windows\guid_string.cc" <RuntimeTypeInfo>false</RuntimeTypeInfo>
> <StringPooling>true</StringPooling>
</File> <TreatWarningAsError>true</TreatWarningAsError>
<File <WarningLevel>Level4</WarningLevel>
RelativePath=".\ms_symbol_server_converter.cc" </ClCompile>
> <Lib>
</File> <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<File <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc" <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
> </Lib>
</File> <Link>
<File <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
RelativePath="..\..\..\common\windows\string_utils.cc" <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
> <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
</File> <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Filter> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<Filter <FixedBaseAddress>false</FixedBaseAddress>
Name="Header Files" <GenerateDebugInformation>true</GenerateDebugInformation>
Filter="h;hpp;hxx;hm;inl;inc;xsd" <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
> <OptimizeReferences>true</OptimizeReferences>
<File <SubSystem>Console</SubSystem>
RelativePath="..\..\..\common\windows\guid_string.h" <TargetMachine>MachineX86</TargetMachine>
> </Link>
</File> <Midl>
<File <DllDataFileName>dlldata.c</DllDataFileName>
RelativePath=".\ms_symbol_server_converter.h" <GenerateStublessProxies>true</GenerateStublessProxies>
> <HeaderFileName>%(Filename).h</HeaderFileName>
</File> <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
<File <OutputDirectory>$(IntDir)</OutputDirectory>
RelativePath="..\..\..\common\windows\pdb_source_line_writer.h" <ProxyFileName>%(Filename)_p.c</ProxyFileName>
> <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
</File> </Midl>
<File <ResourceCompile>
RelativePath="..\..\..\common\windows\string_utils-inl.h" <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
> <Culture>0x0409</Culture>
</File> <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Filter> </ResourceCompile>
<Filter </ItemDefinitionGroup>
Name="Resource Files" <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" <ClCompile>
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
</Filter> <BufferSecurityCheck>true</BufferSecurityCheck>
</Files> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<Globals> <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</Globals> <ExceptionHandling>false</ExceptionHandling>
</VisualStudioProject> <FunctionLevelLinking>true</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<TreatWarningAsError>true</TreatWarningAsError>
<WarningLevel>Level4</WarningLevel>
</ClCompile>
<Lib>
<AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
<OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
</Lib>
<Link>
<AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
<AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
<DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<FixedBaseAddress>false</FixedBaseAddress>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
<MapFileName>$(OutDir)$(TargetName).map</MapFileName>
<SubSystem>Console</SubSystem>
<TargetMachine>MachineX64</TargetMachine>
</Link>
<Midl>
<DllDataFileName>dlldata.c</DllDataFileName>
<GenerateStublessProxies>true</GenerateStublessProxies>
<HeaderFileName>%(Filename).h</HeaderFileName>
<InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
<OutputDirectory>$(IntDir)</OutputDirectory>
<ProxyFileName>%(Filename)_p.c</ProxyFileName>
<TypeLibraryName>%(Filename).tlb</TypeLibraryName>
</Midl>
<ResourceCompile>
<AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="ms_symbol_server_converter.gyp"/>
</ItemGroup>
<ItemGroup>
<ClCompile Include="ms_symbol_server_converter.cc"/>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
<ImportGroup Label="ExtensionTargets"/>
</Project>