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/symbol_supplier.h \
src/processor/crash_report_processor.cc \
src/processor/linked_ptr.h \
src/processor/memory_region.h \
src/processor/minidump.cc \
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@
# 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@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
@ -293,6 +291,7 @@ src_libairbag_la_SOURCES = \
src/google/stack_frame.h \
src/google/symbol_supplier.h \
src/processor/crash_report_processor.cc \
src/processor/linked_ptr.h \
src/processor/memory_region.h \
src/processor/minidump.cc \
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
// 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
// initially created.
@ -125,7 +125,7 @@ bool RangeMap<AddressType, EntryType>::StoreRange(const AddressType& base,
template<typename AddressType, typename EntryType>
bool RangeMap<AddressType, EntryType>::RetrieveRange(
const AddressType& address,
EntryType* entry) {
EntryType* entry) const {
if (!entry)
return false;

View File

@ -19,6 +19,8 @@
#include <utility>
#include "processor/source_line_resolver.h"
#include "google/stack_frame.h"
#include "processor/linked_ptr.h"
#include "processor/range_map.h"
using std::map;
using std::vector;
@ -27,62 +29,29 @@ using __gnu_cxx::hash;
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 {
Line(MemAddr addr, int file_id, int source_line)
: address(addr), source_file_id(file_id), line(source_line) { }
Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)
: address(addr)
, size(code_size)
, source_file_id(file_id)
, line(source_line) { }
MemAddr address;
MemAddr size;
int source_file_id;
int line;
};
struct SourceLineResolver::Function {
Function(const string &function_name, MemAddr function_address)
: name(function_name), address(function_address) { }
Function(const string &function_name,
MemAddr function_address,
MemAddr code_size)
: name(function_name), address(function_address), size(code_size) { }
string name;
MemAddr address;
MemAddrMap<Line> lines;
MemAddr size;
RangeMap<MemAddr, linked_ptr<Line> > lines;
};
class SourceLineResolver::Module {
@ -111,7 +80,7 @@ class SourceLineResolver::Module {
string name_;
FileMap files_;
MemAddrMap<Function> functions_;
RangeMap<MemAddr, linked_ptr<Function> > functions_;
};
SourceLineResolver::SourceLineResolver() : modules_(new ModuleMap) {
@ -166,7 +135,8 @@ bool SourceLineResolver::Module::LoadMap(const string &map_file) {
if (!cur_func) {
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 {
if (!cur_func) {
return false;
@ -175,7 +145,8 @@ bool SourceLineResolver::Module::LoadMap(const string &map_file) {
if (!line) {
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,
StackFrame *frame) const {
Function *func = functions_.FindContainingEntry(address);
if (!func) {
linked_ptr<Function> func;
if (!functions_.RetrieveRange(address, &func)) {
return;
}
frame->function_name = func->name;
Line *line = func->lines.FindContainingEntry(address);
if (!line) {
linked_ptr<Line> line;
if (!func->lines.RetrieveRange(address, &line)) {
return;
}
@ -231,12 +202,17 @@ SourceLineResolver::Function* SourceLineResolver::Module::ParseFunction(
return NULL;
}
char *size = strtok(NULL, " ");
if (!size) {
return NULL;
}
char *name = strtok(NULL, "\r\n");
if (!name) {
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(
@ -247,6 +223,11 @@ SourceLineResolver::Line* SourceLineResolver::Module::ParseLine(
return NULL;
}
char *size = strtok(NULL, " ");
if (!size) {
return NULL;
}
char *line_num_str = strtok(NULL, "\r\n");
if (!line_num_str) {
return NULL;
@ -257,7 +238,10 @@ SourceLineResolver::Line* SourceLineResolver::Module::ParseLine(
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 {

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 2 file1_2.cc
FILE 3 file1_3.cc
FUNC 1000 Function1_1
1000 44 1
1004 45 1
1008 46 1
FUNC 1100 Function1_2
1100 65 2
1104 66 2
FUNC 1200 Function1_3
FUNC 1300 Function1_4
FUNC 1000 c Function1_1
1000 4 44 1
1004 4 45 1
1008 4 46 1
FUNC 1100 8 Function1_2
1100 4 65 2
1104 4 66 2
FUNC 1200 100 Function1_3
FUNC 1300 100 Function1_4

View File

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

View File

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

View File

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