Revision: 2699
Author: [email protected]
Date: Mon Aug 17 06:45:03 2009
Log: Fix issue 427: JS tick processor now works out-of-the-box for Chromium  
on Windows.

MSVS names '.map' file using only module's name, so both 'a.exe'  
and 'a.dll' will have 'a.map' file. To distinguish an originating module,  
we're now checking for image base which is always 00400000 for .exe files,  
and not 00400000 for .dlls.

Verified that windows-tick-processor can now process logs from Chromium  
using .map file generated for 'chrome.dll', an that it still works for  
V8's 'shell.exe'.

Review URL: http://codereview.chromium.org/172044
http://code.google.com/p/v8/source/detail?r=2699

Modified:
  /branches/bleeding_edge/test/mjsunit/tools/tickprocessor.js
  /branches/bleeding_edge/tools/tickprocessor.js

=======================================
--- /branches/bleeding_edge/test/mjsunit/tools/tickprocessor.js Tue Jul 14  
02:47:44 2009
+++ /branches/bleeding_edge/test/mjsunit/tools/tickprocessor.js Mon Aug 17  
06:45:03 2009
@@ -227,6 +227,78 @@
  })();


+// http://code.google.com/p/v8/issues/detail?id=427
+(function testWindowsProcessExeAndDllMapFile() {
+  function exeSymbols(exeName) {
+    return [
+      ' 0000:00000000       ___ImageBase               00400000      
<linker-defined>',
+      ' 0001:00000780       ?RunMain@@yahhqa...@z      00401780 f    
shell.obj',
+      ' 0001:00000ac0       _main                      00401ac0 f    
shell.obj',
+      ''
+    ].join('\r\n');
+  }
+
+  function dllSymbols(dllName) {
+    return [
+      ' 0000:00000000       ___ImageBase               01c30000      
<linker-defined>',
+      ' 0001:00000780       _dllm...@12                01c31780 f    
libcmt:dllmain.obj',
+      ' 0001:00000ac0       ___DllMainCRTStartup       01c31ac0 f    
libcmt:dllcrt0.obj',
+      ''
+    ].join('\r\n');
+  }
+
+  var oldRead = read;
+
+  read = exeSymbols;
+  var exe_exe_syms = [];
+  (new WindowsCppEntriesProvider()).parseVmSymbols(
+      'chrome.exe', 0x00400000, 0x00472000,
+      function (name, start, end) {
+        exe_exe_syms.push(Array.prototype.slice.apply(arguments, [0]));
+      });
+  assertEquals(
+      [['RunMain', 0x00401780, 0x00401ac0],
+       ['_main', 0x00401ac0, 0x00472000]],
+      exe_exe_syms, '.exe with .exe symbols');
+
+  read = dllSymbols;
+  var exe_dll_syms = [];
+  (new WindowsCppEntriesProvider()).parseVmSymbols(
+      'chrome.exe', 0x00400000, 0x00472000,
+      function (name, start, end) {
+        exe_dll_syms.push(Array.prototype.slice.apply(arguments, [0]));
+      });
+  assertEquals(
+      [],
+      exe_dll_syms, '.exe with .dll symbols');
+
+  read = dllSymbols;
+  var dll_dll_syms = [];
+  (new WindowsCppEntriesProvider()).parseVmSymbols(
+      'chrome.dll', 0x01c30000, 0x02b80000,
+      function (name, start, end) {
+        dll_dll_syms.push(Array.prototype.slice.apply(arguments, [0]));
+      });
+  assertEquals(
+      [['_dllm...@12', 0x01c31780, 0x01c31ac0],
+       ['___DllMainCRTStartup', 0x01c31ac0, 0x02b80000]],
+      dll_dll_syms, '.dll with .dll symbols');
+
+  read = exeSymbols;
+  var dll_exe_syms = [];
+  (new WindowsCppEntriesProvider()).parseVmSymbols(
+      'chrome.dll', 0x01c30000, 0x02b80000,
+      function (name, start, end) {
+        dll_exe_syms.push(Array.prototype.slice.apply(arguments, [0]));
+      });
+  assertEquals(
+      [],
+      dll_exe_syms, '.dll with .exe symbols');
+
+  read = oldRead;
+})();
+
+
  function CppEntriesProviderMock() {
  };

=======================================
--- /branches/bleeding_edge/tools/tickprocessor.js      Tue Jul 28 08:37:05 2009
+++ /branches/bleeding_edge/tools/tickprocessor.js      Mon Aug 17 06:45:03 2009
@@ -499,19 +499,32 @@
  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 @@

    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)  
} :

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to