Make SourceLineResolver use RangeMap (#13). r=bryner

- Eliminate MemAddrMap from source_line_resolver.cc and adapt it to use
   RangeMap, also used by minidump.cc.
 - RangeMap operates on both a base address and a size, where MemAddrMap
   only used a base address, so the dumped symbol file format is modified
   to include size information.  dump_syms produces these files and
   SourceLineResolver consumes them.
 - Provide updated test data conforming to the new dumped symbol format.

http://groups.google.com/group/airbag-dev/browse_thread/thread/e9403cf3ad6336a1


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@21 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
mmentovai 2006-09-08 18:03:56 +00:00
parent 6dd21d3baf
commit cb9fd5b773
13 changed files with 8197 additions and 7572 deletions

View File

@ -41,6 +41,7 @@ src_libairbag_la_SOURCES = \
src/google/stack_frame.h \ src/google/stack_frame.h \
src/google/symbol_supplier.h \ src/google/symbol_supplier.h \
src/processor/crash_report_processor.cc \ src/processor/crash_report_processor.cc \
src/processor/linked_ptr.h \
src/processor/memory_region.h \ src/processor/memory_region.h \
src/processor/minidump.cc \ src/processor/minidump.cc \
src/processor/minidump.h \ src/processor/minidump.h \

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.9.5 from Makefile.am. # Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -31,8 +31,6 @@
SOURCES = $(src_libairbag_la_SOURCES) $(src_processor_crash_report_processor_unittest_SOURCES) $(src_processor_minidump_dump_SOURCES) $(src_processor_minidump_stackwalk_SOURCES) $(src_processor_range_map_unittest_SOURCES) $(src_processor_source_line_resolver_unittest_SOURCES)
srcdir = @srcdir@ srcdir = @srcdir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
@ -293,6 +291,7 @@ src_libairbag_la_SOURCES = \
src/google/stack_frame.h \ src/google/stack_frame.h \
src/google/symbol_supplier.h \ src/google/symbol_supplier.h \
src/processor/crash_report_processor.cc \ src/processor/crash_report_processor.cc \
src/processor/linked_ptr.h \
src/processor/memory_region.h \ src/processor/memory_region.h \
src/processor/minidump.cc \ src/processor/minidump.cc \
src/processor/minidump.h \ src/processor/minidump.h \

1621
aclocal.m4 vendored

File diff suppressed because it is too large Load Diff

174
src/processor/linked_ptr.h Normal file
View File

@ -0,0 +1,174 @@
// Copyright (C) 2006 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// A "smart" pointer type with reference tracking. Every pointer to a
// particular object is kept on a circular linked list. When the last pointer
// to an object is destroyed or reassigned, the object is deleted.
//
// Used properly, this deletes the object when the last reference goes away.
// There are several caveats:
// - Like all reference counting schemes, cycles lead to leaks.
// - Each smart pointer is actually two pointers (8 bytes instead of 4).
// - Every time a pointer is assigned, the entire list of pointers to that
// object is traversed. This class is therefore NOT SUITABLE when there
// will often be more than two or three pointers to a particular object.
// - References are only tracked as long as linked_ptr<> objects are copied.
// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
// will happen (double deletion).
//
// A good use of this class is storing object references in STL containers.
// You can safely put linked_ptr<> in a vector<>.
// Other uses may not be as good.
//
// Note: If you use an incomplete type with linked_ptr<>, the class
// *containing* linked_ptr<> must have a constructor and destructor (even
// if they do nothing!).
#ifndef PROCESSOR_LINKED_PTR_H__
#define PROCESSOR_LINKED_PTR_H__
// This is used internally by all instances of linked_ptr<>. It needs to be
// a non-template class because different types of linked_ptr<> can refer to
// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
// So, it needs to be possible for different types of linked_ptr to participate
// in the same circular linked list, so we need a single class type here.
//
// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
class linked_ptr_internal {
public:
// Create a new circle that includes only this instance.
void join_new() {
next_ = this;
}
// Join an existing circle.
void join(linked_ptr_internal const* ptr) {
linked_ptr_internal const* p = ptr;
while (p->next_ != ptr) p = p->next_;
p->next_ = this;
next_ = ptr;
}
// Leave whatever circle we're part of. Returns true iff we were the
// last member of the circle. Once this is done, you can join() another.
bool depart() {
if (next_ == this) return true;
linked_ptr_internal const* p = next_;
while (p->next_ != this) p = p->next_;
p->next_ = next_;
return false;
}
private:
mutable linked_ptr_internal const* next_;
};
template <typename T>
class linked_ptr {
public:
typedef T element_type;
// Take over ownership of a raw pointer. This should happen as soon as
// possible after the object is created.
explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
~linked_ptr() { depart(); }
// Copy an existing linked_ptr<>, adding ourselves to the list of references.
template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
linked_ptr(linked_ptr const& ptr) { copy(&ptr); }
// Assignment releases the old value and acquires the new.
template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
depart();
copy(&ptr);
return *this;
}
linked_ptr& operator=(linked_ptr const& ptr) {
if (&ptr != this) {
depart();
copy(&ptr);
}
return *this;
}
// Smart pointer members.
void reset(T* ptr = NULL) { depart(); capture(ptr); }
T* get() const { return value_; }
T* operator->() const { return value_; }
T& operator*() const { return *value_; }
// Release ownership of the pointed object and returns it.
// Sole ownership by this linked_ptr object is required.
T* release() {
bool last = link_.depart();
T* v = value_;
value_ = NULL;
return v;
}
bool operator==(T* p) const { return value_ == p; }
bool operator!=(T* p) const { return value_ != p; }
template <typename U>
bool operator==(linked_ptr<U> const& ptr) const {
return value_ == ptr.get();
}
template <typename U>
bool operator!=(linked_ptr<U> const& ptr) const {
return value_ != ptr.get();
}
private:
template <typename U>
friend class linked_ptr;
T* value_;
linked_ptr_internal link_;
void depart() {
if (link_.depart()) delete value_;
}
void capture(T* ptr) {
value_ = ptr;
link_.join_new();
}
template <typename U> void copy(linked_ptr<U> const* ptr) {
value_ = ptr->get();
if (value_)
link_.join(&ptr->link_);
else
link_.join_new();
}
};
template<typename T> inline
bool operator==(T* ptr, const linked_ptr<T>& x) {
return ptr == x.get();
}
template<typename T> inline
bool operator!=(T* ptr, const linked_ptr<T>& x) {
return ptr != x.get();
}
// A function to convert T* into linked_ptr<T>
// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
template <typename T>
linked_ptr<T> make_linked_ptr(T* ptr) {
return linked_ptr<T>(ptr);
}
#endif // PROCESSOR_LINKED_PTR_H__

View File

@ -49,7 +49,7 @@ class RangeMap {
// Locates the range encompassing the supplied address. If there is // Locates the range encompassing the supplied address. If there is
// no such range, or if there is a parameter error, returns false. // no such range, or if there is a parameter error, returns false.
bool RetrieveRange(const AddressType& address, EntryType* entry); bool RetrieveRange(const AddressType& address, EntryType* entry) const;
// Empties the range map, restoring it to the state it was when it was // Empties the range map, restoring it to the state it was when it was
// initially created. // initially created.
@ -125,7 +125,7 @@ bool RangeMap<AddressType, EntryType>::StoreRange(const AddressType& base,
template<typename AddressType, typename EntryType> template<typename AddressType, typename EntryType>
bool RangeMap<AddressType, EntryType>::RetrieveRange( bool RangeMap<AddressType, EntryType>::RetrieveRange(
const AddressType& address, const AddressType& address,
EntryType* entry) { EntryType* entry) const {
if (!entry) if (!entry)
return false; return false;

View File

@ -19,6 +19,8 @@
#include <utility> #include <utility>
#include "processor/source_line_resolver.h" #include "processor/source_line_resolver.h"
#include "google/stack_frame.h" #include "google/stack_frame.h"
#include "processor/linked_ptr.h"
#include "processor/range_map.h"
using std::map; using std::map;
using std::vector; using std::vector;
@ -27,62 +29,29 @@ using __gnu_cxx::hash;
namespace google_airbag { namespace google_airbag {
// MemAddrMap is a map subclass which has the following properties:
// - stores pointers to an "entry" type, which are deleted on destruction
// - suitable for address lookup via FindContainingEntry
template<class T>
class SourceLineResolver::MemAddrMap : public map<MemAddr, T*> {
public:
~MemAddrMap();
// Find the entry which "contains" a given relative address, that is,
// the entry with the highest address not greater than the given address.
// Returns NULL if there is no such entry.
T* FindContainingEntry(MemAddr address) const;
private:
typedef map<MemAddr, T*> MapType;
};
template<class T>
SourceLineResolver::MemAddrMap<T>::~MemAddrMap() {
typename MapType::iterator it;
for (it = MapType::begin(); it != MapType::end(); ++it) {
delete it->second;
}
}
template<class T>
T* SourceLineResolver::MemAddrMap<T>::FindContainingEntry(
MemAddr address) const {
typename MapType::const_iterator it = MapType::lower_bound(address);
if (it->first != address) {
if (it == MapType::begin()) {
// Nowhere to go, so no entry contains the address
return NULL;
}
--it; // back up to the entry before address
}
return it->second;
}
struct SourceLineResolver::Line { struct SourceLineResolver::Line {
Line(MemAddr addr, int file_id, int source_line) Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)
: address(addr), source_file_id(file_id), line(source_line) { } : address(addr)
, size(code_size)
, source_file_id(file_id)
, line(source_line) { }
MemAddr address; MemAddr address;
MemAddr size;
int source_file_id; int source_file_id;
int line; int line;
}; };
struct SourceLineResolver::Function { struct SourceLineResolver::Function {
Function(const string &function_name, MemAddr function_address) Function(const string &function_name,
: name(function_name), address(function_address) { } MemAddr function_address,
MemAddr code_size)
: name(function_name), address(function_address), size(code_size) { }
string name; string name;
MemAddr address; MemAddr address;
MemAddrMap<Line> lines; MemAddr size;
RangeMap<MemAddr, linked_ptr<Line> > lines;
}; };
class SourceLineResolver::Module { class SourceLineResolver::Module {
@ -111,7 +80,7 @@ class SourceLineResolver::Module {
string name_; string name_;
FileMap files_; FileMap files_;
MemAddrMap<Function> functions_; RangeMap<MemAddr, linked_ptr<Function> > functions_;
}; };
SourceLineResolver::SourceLineResolver() : modules_(new ModuleMap) { SourceLineResolver::SourceLineResolver() : modules_(new ModuleMap) {
@ -166,7 +135,8 @@ bool SourceLineResolver::Module::LoadMap(const string &map_file) {
if (!cur_func) { if (!cur_func) {
return false; return false;
} }
functions_.insert(make_pair(cur_func->address, cur_func)); functions_.StoreRange(cur_func->address, cur_func->size,
linked_ptr<Function>(cur_func));
} else { } else {
if (!cur_func) { if (!cur_func) {
return false; return false;
@ -175,7 +145,8 @@ bool SourceLineResolver::Module::LoadMap(const string &map_file) {
if (!line) { if (!line) {
return false; return false;
} }
cur_func->lines.insert(make_pair(line->address, line)); cur_func->lines.StoreRange(line->address, line->size,
linked_ptr<Line>(line));
} }
} }
@ -185,14 +156,14 @@ bool SourceLineResolver::Module::LoadMap(const string &map_file) {
void SourceLineResolver::Module::LookupAddress(MemAddr address, void SourceLineResolver::Module::LookupAddress(MemAddr address,
StackFrame *frame) const { StackFrame *frame) const {
Function *func = functions_.FindContainingEntry(address); linked_ptr<Function> func;
if (!func) { if (!functions_.RetrieveRange(address, &func)) {
return; return;
} }
frame->function_name = func->name; frame->function_name = func->name;
Line *line = func->lines.FindContainingEntry(address); linked_ptr<Line> line;
if (!line) { if (!func->lines.RetrieveRange(address, &line)) {
return; return;
} }
@ -231,12 +202,17 @@ SourceLineResolver::Function* SourceLineResolver::Module::ParseFunction(
return NULL; return NULL;
} }
char *size = strtok(NULL, " ");
if (!size) {
return NULL;
}
char *name = strtok(NULL, "\r\n"); char *name = strtok(NULL, "\r\n");
if (!name) { if (!name) {
return NULL; return NULL;
} }
return new Function(name, strtoull(addr, NULL, 16)); return new Function(name, strtoull(addr, NULL, 16), strtoull(size, NULL, 16));
} }
SourceLineResolver::Line* SourceLineResolver::Module::ParseLine( SourceLineResolver::Line* SourceLineResolver::Module::ParseLine(
@ -247,6 +223,11 @@ SourceLineResolver::Line* SourceLineResolver::Module::ParseLine(
return NULL; return NULL;
} }
char *size = strtok(NULL, " ");
if (!size) {
return NULL;
}
char *line_num_str = strtok(NULL, "\r\n"); char *line_num_str = strtok(NULL, "\r\n");
if (!line_num_str) { if (!line_num_str) {
return NULL; return NULL;
@ -257,7 +238,10 @@ SourceLineResolver::Line* SourceLineResolver::Module::ParseLine(
return NULL; return NULL;
} }
return new Line(strtoull(addr, NULL, 16), source_file, line_number); return new Line(strtoull(addr, NULL, 16),
strtoull(size, NULL, 16),
source_file,
line_number);
} }
size_t SourceLineResolver::HashString::operator()(const string &s) const { size_t SourceLineResolver::HashString::operator()(const string &s) const {

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
FILE 1 file1_1.cc FILE 1 file1_1.cc
FILE 2 file1_2.cc FILE 2 file1_2.cc
FILE 3 file1_3.cc FILE 3 file1_3.cc
FUNC 1000 Function1_1 FUNC 1000 c Function1_1
1000 44 1 1000 4 44 1
1004 45 1 1004 4 45 1
1008 46 1 1008 4 46 1
FUNC 1100 Function1_2 FUNC 1100 8 Function1_2
1100 65 2 1100 4 65 2
1104 66 2 1104 4 66 2
FUNC 1200 Function1_3 FUNC 1200 100 Function1_3
FUNC 1300 Function1_4 FUNC 1300 100 Function1_4

View File

@ -1,12 +1,12 @@
FILE 1 file2_1.cc FILE 1 file2_1.cc
FILE 2 file2_2.cc FILE 2 file2_2.cc
FILE 3 file2_3.cc FILE 3 file2_3.cc
FUNC 2000 Function2_1 FUNC 2000 c Function2_1
1000 54 1 1000 4 54 1
1004 55 1 1004 4 55 1
1008 56 1 1008 4 56 1
FUNC 2170 Function2_2 FUNC 2170 14 Function2_2
2170 10 2 2170 6 10 2
2176 12 2 2176 4 12 2
217a 13 2 217a 6 13 2
2180 21 2 2180 4 21 2

View File

@ -23,7 +23,7 @@ using std::wstring;
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc < 2) { if (argc < 2) {
fprintf(stderr, "Usage: %s <pdb file>", argv[0]); fprintf(stderr, "Usage: %s <pdb file>\n", argv[0]);
return 1; return 1;
} }

View File

@ -65,6 +65,12 @@ bool PDBSourceLineWriter::PrintLines(IDiaEnumLineNumbers *lines) {
return false; return false;
} }
DWORD length;
if (FAILED(line->get_length(&length))) {
fprintf(stderr, "failed to get line code length\n");
return false;
}
DWORD source_id; DWORD source_id;
if (FAILED(line->get_sourceFileId(&source_id))) { if (FAILED(line->get_sourceFileId(&source_id))) {
fprintf(stderr, "failed to get line source file id\n"); fprintf(stderr, "failed to get line source file id\n");
@ -77,7 +83,7 @@ bool PDBSourceLineWriter::PrintLines(IDiaEnumLineNumbers *lines) {
return false; return false;
} }
fprintf(output_, "%x %d %d\n", rva, line_num, source_id); fprintf(output_, "%x %x %d %d\n", rva, length, line_num, source_id);
line.Release(); line.Release();
} }
return true; return true;
@ -113,7 +119,7 @@ bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function) {
return false; return false;
} }
fwprintf(output_, L"FUNC %x %s\n", rva, name); fwprintf(output_, L"FUNC %x %llx %s\n", rva, length, name);
if (!PrintLines(lines)) { if (!PrintLines(lines)) {
return false; return false;
} }

View File

@ -1179,354 +1179,354 @@ FILE 1178 f:\rtm\public\sdk\inc\ddbanned.h
FILE 1179 f:\rtm\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h FILE 1179 f:\rtm\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h
FILE 1180 f:\rtm\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h FILE 1180 f:\rtm\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h
FILE 1181 f:\rtm\public\sdk\inc\tvout.h FILE 1181 f:\rtm\public\sdk\inc\tvout.h
FUNC 1000 main FUNC 1000 187 main
1000 24 172 1000 39 24 172
1039 25 172 1039 11 25 172
104a 26 172 104a 1b 26 172
1065 27 172 1065 a 27 172
106f 31 172 106f 23 31 172
1092 32 172 1092 9 32 172
109b 33 172 109b 2 33 172
109d 36 172 109d 9 36 172
10a6 37 172 10a6 47 37 172
10ed 38 172 10ed 18 38 172
1105 39 172 1105 1b 39 172
1120 42 172 1120 19 42 172
1139 43 172 1139 7 43 172
1140 44 172 1140 2 44 172
1142 47 172 1142 9 47 172
114b 48 172 114b 16 48 172
1161 49 172 1161 26 49 172
FUNC 1190 ATL::CComBSTR::~CComBSTR FUNC 1190 a ATL::CComBSTR::~CComBSTR
1190 1351 28 1190 0 1351 28
1190 1352 28 1190 9 1352 28
1199 1353 28 1199 1 1353 28
FUNC 11a0 ATL::CComPtr<IDiaEnumSymbolsByAddr>::~CComPtr<IDiaEnumSymbolsByAddr> FUNC 11a0 f ATL::CComPtr<IDiaEnumSymbolsByAddr>::~CComPtr<IDiaEnumSymbolsByAddr>
11a0 25 26 11a0 0 25 26
11a0 26 26 11a0 f 26 26
FUNC 11b0 airbag::PDBSourceLineWriter::Close FUNC 11b0 15 airbag::PDBSourceLineWriter::Close
11b0 212 26 11b0 0 212 26
11b0 213 26 11b0 14 213 26
11c4 214 26 11c4 1 214 26
FUNC 11d0 airbag::PDBSourceLineWriter::PDBSourceLineWriter FUNC 11d0 10 airbag::PDBSourceLineWriter::PDBSourceLineWriter
11d0 22 26 11d0 f 22 26
11df 23 26 11df 1 23 26
FUNC 11e0 airbag::PDBSourceLineWriter::Open FUNC 11e0 163 airbag::PDBSourceLineWriter::Open
11e0 28 26 11e0 24 28 26
1204 29 26 1204 14 29 26
1218 31 26 1218 c 31 26
1224 32 26 1224 18 32 26
123c 33 26 123c 2 33 26
123e 53 26 123e 13 53 26
1251 36 26 1251 8 36 26
1259 37 26 1259 25 37 26
127e 39 26 127e 15 39 26
1293 40 26 1293 1d 40 26
12b0 53 26 12b0 13 53 26
12c3 43 26 12c3 23 43 26
12e6 44 26 12e6 5 44 26
12eb 45 26 12eb 2 45 26
12ed 48 26 12ed 11 48 26
12fe 49 26 12fe 18 49 26
1316 52 26 1316 1a 52 26
1330 53 26 1330 13 53 26
FUNC 1350 airbag::PDBSourceLineWriter::PrintLines FUNC 1350 19b airbag::PDBSourceLineWriter::PrintLines
1350 55 26 1350 29 55 26
1379 58 26 1379 6 58 26
137f 61 26 137f 3c 61 26
13bb 63 26 13bb 19 63 26
13d4 69 26 13d4 19 69 26
13ed 75 26 13ed 19 75 26
1406 80 26 1406 1a 80 26
1420 81 26 1420 34 81 26
1454 83 26 1454 1a 83 26
146e 84 26 146e 16 84 26
1484 64 26 1484 11 64 26
1495 65 26 1495 1f 65 26
14b4 70 26 14b4 11 70 26
14c5 71 26 14c5 1f 71 26
14e4 76 26 14e4 5 76 26
14e9 77 26 14e9 2 77 26
FUNC 14f0 airbag::PDBSourceLineWriter::PrintFunction FUNC 14f0 1d3 airbag::PDBSourceLineWriter::PrintFunction
14f0 86 26 14f0 28 86 26
1518 89 26 1518 6 89 26
151e 90 26 151e 19 90 26
1537 91 26 1537 18 91 26
154f 113 26 154f 5 113 26
1554 92 26 1554 8 92 26
155c 121 26 155c 15 121 26
1571 94 26 1571 f 94 26
1580 95 26 1580 15 95 26
1595 96 26 1595 10 96 26
15a5 121 26 15a5 15 121 26
15ba 100 26 15ba 11 100 26
15cb 101 26 15cb 5 101 26
15d0 102 26 15d0 5 102 26
15d5 106 26 15d5 11 106 26
15e6 107 26 15e6 15 107 26
15fb 108 26 15fb d 108 26
1608 111 26 1608 4 111 26
160c 112 26 160c 22 112 26
162e 113 26 162e 1d 113 26
164b 116 26 164b 19 116 26
1664 117 26 1664 11 117 26
1675 118 26 1675 20 118 26
1695 120 26 1695 19 120 26
16ae 121 26 16ae 15 121 26
FUNC 16d0 airbag::PDBSourceLineWriter::PrintSourceFiles FUNC 16d0 326 airbag::PDBSourceLineWriter::PrintSourceFiles
16d0 123 26 16d0 29 123 26
16f9 124 26 16f9 6 124 26
16ff 125 26 16ff 17 125 26
1716 126 26 1716 18 126 26
172e 134 26 172e 18 134 26
1746 127 26 1746 2 127 26
1748 162 26 1748 14 162 26
175c 130 26 175c 4 130 26
1760 132 26 1760 21 132 26
1781 133 26 1781 18 133 26
1799 142 26 1799 19 142 26
17b2 137 26 17b2 4 137 26
17b6 139 26 17b6 45 139 26
17fb 140 26 17fb 4 140 26
17ff 141 26 17ff 23 141 26
1822 144 26 1822 4 144 26
1826 145 26 1826 35 145 26
185b 147 26 185b 19 147 26
1874 151 26 1874 4 151 26
1878 152 26 1878 1e 152 26
1896 156 26 1896 15 156 26
18ab 157 26 18ab 17 157 26
18c2 158 26 18c2 2c 158 26
18ee 159 26 18ee 14 159 26
1902 160 26 1902 4a 160 26
194c 161 26 194c 43 161 26
198f 162 26 198f 14 162 26
19a3 142 26 19a3 33 142 26
19d6 148 26 19d6 17 148 26
19ed 153 26 19ed 9 153 26
FUNC 1a00 airbag::PDBSourceLineWriter::PrintFunctions FUNC 1a00 1b1 airbag::PDBSourceLineWriter::PrintFunctions
1a00 164 26 1a00 27 164 26
1a27 165 26 1a27 6 165 26
1a2d 166 26 1a2d 17 166 26
1a44 167 26 1a44 18 167 26
1a5c 174 26 1a5c 18 174 26
1a74 168 26 1a74 2 168 26
1a76 199 26 1a76 12 199 26
1a88 171 26 1a88 4 171 26
1a8c 172 26 1a8c 1d 172 26
1aa9 173 26 1aa9 18 173 26
1ac1 174 26 1ac1 16 174 26
1ad7 178 26 1ad7 19 178 26
1af0 179 26 1af0 5 179 26
1af5 180 26 1af5 b 180 26
1b00 186 26 1b00 19 186 26
1b19 190 26 1b19 7 190 26
1b20 191 26 1b20 10 191 26
1b30 195 26 1b30 14 195 26
1b44 196 26 1b44 23 196 26
1b67 198 26 1b67 2e 198 26
1b95 199 26 1b95 12 199 26
1ba7 187 26 1ba7 5 187 26
1bac 188 26 1bac 5 188 26
FUNC 1bc0 airbag::PDBSourceLineWriter::WriteMap FUNC 1bc0 35 airbag::PDBSourceLineWriter::WriteMap
1bc0 201 26 1bc0 0 201 26
1bc0 203 26 1bc0 d 203 26
1bcd 204 26 1bcd 12 204 26
1bdf 208 26 1bdf 9 208 26
1be8 210 26 1be8 3 210 26
1beb 208 26 1beb 4 208 26
1bef 209 26 1bef 3 209 26
1bf2 210 26 1bf2 3 210 26
FUNC 1c02 __security_check_cookie FUNC 1c02 f __security_check_cookie
1c02 52 1111 1c02 0 52 1111
1c02 55 1111 1c02 6 55 1111
1c08 56 1111 1c08 2 56 1111
1c0a 57 1111 1c0a 2 57 1111
1c0c 59 1111 1c0c 5 59 1111
FUNC 1c11 pre_cpp_init FUNC 1c11 4b pre_cpp_init
1c11 310 576 1c11 0 310 576
1c11 312 576 1c11 a 312 576
1c1b 322 576 1c1b 5 322 576
1c20 330 576 1c20 2a 330 576
1c4a 334 576 1c4a 9 334 576
1c53 335 576 1c53 8 335 576
1c5b 337 576 1c5b 1 337 576
FUNC 1c5c __tmainCRTStartup FUNC 1c5c 176 __tmainCRTStartup
1c5c 410 576 1c5c c 410 576
1c68 433 576 1c68 5 433 576
1c6d 458 576 1c6d 9 458 576
1c76 459 576 1c76 8 459 576
1c7e 460 576 1c7e d 460 576
1c8b 462 576 1c8b 4 462 576
1c8f 464 576 1c8f 6 464 576
1c95 465 576 1c95 2 465 576
1c97 472 576 1c97 b 472 576
1ca2 473 576 1ca2 5 473 576
1ca7 475 576 1ca7 9 475 576
1cb0 477 576 1cb0 a 477 576
1cba 479 576 1cba 9 479 576
1cc3 481 576 1cc3 6 481 576
1cc9 483 576 1cc9 15 483 576
1cde 485 576 1cde 11 485 576
1cef 493 576 1cef 6 493 576
1cf5 499 576 1cf5 9 499 576
1cfe 501 576 1cfe 11 501 576
1d0f 502 576 1d0f a 502 576
1d19 505 576 1d19 5 505 576
1d1e 510 576 1d1e 8 510 576
1d26 521 576 1d26 17 521 576
1d3d 523 576 1d3d a 523 576
1d47 585 576 1d47 d 585 576
1d54 586 576 1d54 1f 586 576
1d73 596 576 1d73 8 596 576
1d7b 597 576 1d7b 7 597 576
1d82 603 576 1d82 17 603 576
1d99 609 576 1d99 8 609 576
1da1 616 576 1da1 a 616 576
1dab 617 576 1dab 7 617 576
1db2 619 576 1db2 8 619 576
1dba 620 576 1dba 6 620 576
1dc0 621 576 1dc0 7 621 576
1dc7 623 576 1dc7 5 623 576
1dcc 624 576 1dcc 6 624 576
FUNC 1dd2 pre_c_init FUNC 1dd2 e2 pre_c_init
1dd2 221 576 1dd2 0 221 576
1dd2 225 576 1dd2 60 225 576
1e32 233 576 1e32 d 233 576
1e3f 241 576 1e3f 14 241 576
1e53 246 576 1e53 e 246 576
1e61 247 576 1e61 e 247 576
1e6f 254 576 1e6f c 254 576
1e7b 261 576 1e7b 5 261 576
1e80 272 576 1e80 5 272 576
1e85 279 576 1e85 9 279 576
1e8e 280 576 1e8e c 280 576
1e9a 283 576 1e9a 5 283 576
1e9f 287 576 1e9f 9 287 576
1ea8 289 576 1ea8 9 289 576
1eb1 292 576 1eb1 2 292 576
1eb3 293 576 1eb3 1 293 576
FUNC 1eb4 mainCRTStartup FUNC 1eb4 a mainCRTStartup
1eb4 393 576 1eb4 0 393 576
1eb4 400 576 1eb4 5 400 576
1eb9 402 576 1eb9 5 402 576
FUNC 1ebe __report_gsfailure FUNC 1ebe 104 __report_gsfailure
1ebe 140 730 1ebe 9 140 730
1ec7 170 730 1ec7 5 170 730
1ecc 171 730 1ecc 6 171 730
1ed2 172 730 1ed2 6 172 730
1ed8 173 730 1ed8 6 173 730
1ede 174 730 1ede 6 174 730
1ee4 175 730 1ee4 6 175 730
1eea 176 730 1eea 7 176 730
1ef1 177 730 1ef1 7 177 730
1ef8 178 730 1ef8 7 178 730
1eff 179 730 1eff 7 179 730
1f06 180 730 1f06 7 180 730
1f0d 181 730 1f0d 7 181 730
1f14 182 730 1f14 1 182 730
1f15 183 730 1f15 6 183 730
1f1b 190 730 1f1b 3 190 730
1f1e 191 730 1f1e 5 191 730
1f23 192 730 1f23 3 192 730
1f26 193 730 1f26 5 193 730
1f2b 194 730 1f2b 3 194 730
1f2e 195 730 1f2e 5 195 730
1f33 201 730 1f33 6 201 730
1f39 204 730 1f39 a 204 730
1f43 206 730 1f43 a 206 730
1f4d 285 730 1f4d a 285 730
1f57 286 730 1f57 a 286 730
1f61 293 730 1f61 b 293 730
1f6c 294 730 1f6c b 294 730
1f77 297 730 1f77 b 297 730
1f82 298 730 1f82 8 298 730
1f8a 302 730 1f8a 8 302 730
1f92 304 730 1f92 b 304 730
1f9d 313 730 1f9d 9 313 730
1fa6 315 730 1fa6 8 315 730
1fae 319 730 1fae 12 319 730
1fc0 320 730 1fc0 2 320 730
FUNC 1fc8 _onexit FUNC 1fc8 9f _onexit
1fc8 79 481 1fc8 c 79 481
1fd4 84 481 1fd4 12 84 481
1fe6 86 481 1fe6 5 86 481
1feb 90 481 1feb c 90 481
1ff7 103 481 1ff7 8 103 481
1fff 105 481 1fff 4 105 481
2003 107 481 2003 b 107 481
200e 108 481 200e b 108 481
2019 110 481 2019 13 110 481
202c 112 481 202c 10 112 481
203c 113 481 203c d 113 481
2049 115 481 2049 c 115 481
2055 120 481 2055 3 120 481
2058 121 481 2058 6 121 481
205e 117 481 205e 9 117 481
FUNC 2067 atexit FUNC 2067 12 atexit
2067 126 481 2067 0 126 481
2067 127 481 2067 11 127 481
2078 128 481 2078 1 128 481
FUNC 2079 _RTC_Initialize FUNC 2079 24 _RTC_Initialize
FUNC 209d _RTC_Terminate FUNC 209d 24 _RTC_Terminate
FUNC 20d0 _ValidateImageBase FUNC 20d0 29 _ValidateImageBase
20d0 44 893 20d0 0 44 893
20d0 50 893 20d0 b 50 893
20db 52 893 20db 2 52 893
20dd 68 893 20dd 1 68 893
20de 55 893 20de 5 55 893
20e3 56 893 20e3 6 56 893
20e9 58 893 20e9 2 58 893
20eb 62 893 20eb d 62 893
20f8 68 893 20f8 1 68 893
FUNC 2100 _FindPESection FUNC 2100 42 _FindPESection
2100 92 893 2100 0 92 893
2100 99 893 2100 9 99 893
2109 108 893 2109 19 108 893
2122 111 893 2122 10 111 893
2132 108 893 2132 a 108 893
213c 123 893 213c 5 123 893
2141 124 893 2141 1 124 893
FUNC 2142 _IsNonwritableInCurrentImage FUNC 2142 6c _IsNonwritableInCurrentImage
2142 152 893 2142 c 152 893
214e 159 893 214e 4 159 893
2152 167 893 2152 e 167 893
2160 169 893 2160 2 169 893
2162 177 893 2162 5 177 893
2167 178 893 2167 9 178 893
2170 179 893 2170 2 179 893
2172 181 893 2172 2 181 893
2174 188 893 2174 14 188 893
2188 190 893 2188 17 190 893
219f 196 893 219f 9 196 893
21a8 198 893 21a8 6 198 893
FUNC 21bc __SEH_prolog4 FUNC 21bc 45 __SEH_prolog4
FUNC 2201 __SEH_epilog4 FUNC 2201 14 __SEH_epilog4
FUNC 2215 _except_handler4 FUNC 2215 23 _except_handler4
FUNC 2238 _setdefaultprecision FUNC 2238 29 _setdefaultprecision
2238 30 1040 2238 1 30 1040
2239 31 1040 2239 27 31 1040
2260 32 1040 2260 1 32 1040
FUNC 2261 _setargv FUNC 2261 3 _setargv
2261 56 616 2261 0 56 616
2261 57 616 2261 2 57 616
2263 58 616 2263 1 58 616
FUNC 2264 __security_init_cookie FUNC 2264 94 __security_init_cookie
2264 97 770 2264 6 97 770
226a 117 770 226a 21 117 770
228b 119 770 228b 7 119 770
2292 120 770 2292 3 120 770
2295 170 770 2295 a 170 770
229f 175 770 229f 6 175 770
22a5 178 770 22a5 8 178 770
22ad 179 770 22ad 8 179 770
22b5 180 770 22b5 8 180 770
22bd 182 770 22bd 10 182 770
22cd 187 770 22cd 2 187 770
22cf 204 770 22cf 4 204 770
22d3 206 770 22d3 7 206 770
22da 209 770 22da 4 209 770
22de 211 770 22de 7 211 770
22e5 215 770 22e5 6 215 770
22eb 216 770 22eb b 216 770
22f6 218 770 22f6 2 218 770