Index: tools/tickprocessor.js |
diff --git a/tools/tickprocessor.js b/tools/tickprocessor.js |
index 34c6195d9a30585de26d921a0639d59a1e070a87..72b3059dcaabf3e1645d2395cfc41cec118eda7d 100644 |
--- a/tools/tickprocessor.js |
+++ b/tools/tickprocessor.js |
@@ -499,19 +499,32 @@ function WindowsCppEntriesProvider() { |
inherits(WindowsCppEntriesProvider, CppEntriesProvider); |
-WindowsCppEntriesProvider.FILENAME_RE = /^(.*)\.exe$/; |
+WindowsCppEntriesProvider.FILENAME_RE = /^(.*)\.([^.]+)$/; |
WindowsCppEntriesProvider.FUNC_RE = |
- /^ 0001:[0-9a-fA-F]{8}\s+([_\?@$0-9a-zA-Z]+)\s+([0-9a-fA-F]{8}).*$/; |
+ /^\s+0001:[0-9a-fA-F]{8}\s+([_\?@$0-9a-zA-Z]+)\s+([0-9a-fA-F]{8}).*$/; |
+ |
+ |
+WindowsCppEntriesProvider.IMAGE_BASE_RE = |
+ /^\s+0000:00000000\s+___ImageBase\s+([0-9a-fA-F]{8}).*$/; |
+ |
+ |
+// This is almost a constant on Windows. |
+WindowsCppEntriesProvider.EXE_IMAGE_BASE = 0x00400000; |
WindowsCppEntriesProvider.prototype.loadSymbols = function(libName) { |
var fileNameFields = libName.match(WindowsCppEntriesProvider.FILENAME_RE); |
- // Only try to load symbols for the .exe file. |
if (!fileNameFields) return; |
var mapFileName = fileNameFields[1] + '.map'; |
- this.symbols = readFile(mapFileName); |
+ this.moduleType_ = fileNameFields[2].toLowerCase(); |
+ try { |
+ this.symbols = read(mapFileName); |
+ } catch (e) { |
+ // If .map file cannot be found let's not panic. |
+ this.symbols = ''; |
+ } |
}; |
@@ -523,6 +536,18 @@ WindowsCppEntriesProvider.prototype.parseNextLine = function() { |
var line = this.symbols.substring(this.parsePos, lineEndPos); |
this.parsePos = lineEndPos + 2; |
+ |
+ // Image base entry is above all other symbols, so we can just |
+ // terminate parsing. |
+ var imageBaseFields = line.match(WindowsCppEntriesProvider.IMAGE_BASE_RE); |
+ if (imageBaseFields) { |
+ var imageBase = parseInt(imageBaseFields[1], 16); |
+ if ((this.moduleType_ == 'exe') != |
+ (imageBase == WindowsCppEntriesProvider.EXE_IMAGE_BASE)) { |
+ return false; |
+ } |
+ } |
+ |
var fields = line.match(WindowsCppEntriesProvider.FUNC_RE); |
return fields ? |
{ name: this.unmangleName(fields[1]), start: parseInt(fields[2], 16) } : |