summaryrefslogtreecommitdiffstats
path: root/tools/valgrind/memcheck_analyze.py
diff options
context:
space:
mode:
authordank@chromium.org <dank@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-26 22:33:05 +0000
committerdank@chromium.org <dank@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-26 22:33:05 +0000
commitac01d9228f3d4d7c78eac683c02ba5c494974b59 (patch)
tree78c42cfabb7ff43a42e260fbd149b744e1f9853c /tools/valgrind/memcheck_analyze.py
parent675595f2f4c6856cdc5190a01056e5aaeb77808f (diff)
downloadchromium_src-ac01d9228f3d4d7c78eac683c02ba5c494974b59.zip
chromium_src-ac01d9228f3d4d7c78eac683c02ba5c494974b59.tar.gz
chromium_src-ac01d9228f3d4d7c78eac683c02ba5c494974b59.tar.bz2
Fix gdb line number lookup on the mac.
1) need to quote filenames 2) need to know what address each library was loaded at 3) need to manually add symlink to chromium framework .dSYM file Review URL: http://codereview.chromium.org/174362 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24548 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/valgrind/memcheck_analyze.py')
-rwxr-xr-xtools/valgrind/memcheck_analyze.py52
1 files changed, 39 insertions, 13 deletions
diff --git a/tools/valgrind/memcheck_analyze.py b/tools/valgrind/memcheck_analyze.py
index 15fe68c..8e7e563 100755
--- a/tools/valgrind/memcheck_analyze.py
+++ b/tools/valgrind/memcheck_analyze.py
@@ -31,10 +31,10 @@ def _GdbOutputToFileLine(output_line):
else:
return None
-def ResolveAddressesWithinABinary(binary_name, address_list):
+def ResolveAddressesWithinABinary(binary_name, load_address, address_list):
''' For each address, return a pair (file, line num) '''
commands = tempfile.NamedTemporaryFile()
- commands.write('file %s\n' % binary_name)
+ commands.write('add-symbol-file "%s" %s\n' % (binary_name, load_address))
for addr in address_list:
commands.write('info line *%s\n' % addr)
commands.write('quit\n')
@@ -59,11 +59,18 @@ def ResolveAddressesWithinABinary(binary_name, address_list):
class _AddressTable(object):
''' Object to do batched line number lookup. '''
def __init__(self):
+ self._load_addresses = {}
self._binaries = {}
self._all_resolved = False
+ def AddBinaryAt(self, binary, load_address):
+ ''' Register a new shared library or executable. '''
+ self._load_addresses[binary] = load_address
+
def Add(self, binary, address):
''' Register a lookup request. '''
+ if binary == '':
+ logging.warn('adding address %s in empty binary?' % address)
if binary in self._binaries:
self._binaries[binary].append(address)
else:
@@ -74,8 +81,10 @@ class _AddressTable(object):
''' Carry out all lookup requests. '''
self._translation = {}
for binary in self._binaries.keys():
- addr = ResolveAddressesWithinABinary(binary, self._binaries[binary])
- self._translation[binary] = addr
+ if binary != '':
+ load_address = self._load_addresses[binary]
+ addr = ResolveAddressesWithinABinary(binary, load_address, self._binaries[binary])
+ self._translation[binary] = addr
self._all_resolved = True
def GetFileLine(self, binary, addr):
@@ -195,13 +204,20 @@ class ValgrindError:
# Each frame looks like this:
# <frame>
# <ip>0x83751BC</ip>
- # <obj>/usr/local/google/bigdata/dkegel/chrome-build/src/out/Release/base_unittests</obj>
+ # <obj>/data/dkegel/chrome-build/src/out/Release/base_unittests</obj>
# <fn>_ZN7testing8internal12TestInfoImpl7RunTestEPNS_8TestInfoE</fn>
# <dir>/data/dkegel/chrome-build/src/testing/gtest/src</dir>
# <file>gtest-internal-inl.h</file>
# <line>655</line>
# </frame>
- # although the dir, file, and line elements are missing if there is no debug info.
+ # although the dir, file, and line elements are missing if there is
+ # no debug info.
+ #
+ # With our patch for https://bugs.kde.org/show_bug.cgi?id=205000 in,
+ # the file also includes records of the form
+ # <load_obj><obj>/usr/lib/libgcc_s.1.dylib</obj><ip>0x27000</ip></load_obj>
+ # giving the filename and load address of each binary that was mapped
+ # into the process.
self._kind = getTextOf(error_node, "kind")
self._backtraces = []
@@ -339,13 +355,7 @@ class MemcheckAnalyze:
if origsize > newsize+1:
logging.warn(str(origsize - newsize) + " bytes of junk were after </valgrindoutput> in %s!" % file)
try:
- raw_errors = parse(file).getElementsByTagName("error")
- for raw_error in raw_errors:
- # Ignore "possible" leaks for now by default.
- if (show_all_leaks or
- getTextOf(raw_error, "kind") != "Leak_PossiblyLost"):
- error = ValgrindError(source_dir, raw_error)
- self._errors.add(error)
+ parsed_file = parse(file);
except ExpatError, e:
self._parse_failed = True
logging.warn("could not parse %s: %s" % (file, e))
@@ -364,6 +374,22 @@ class MemcheckAnalyze:
logging.warn("> %s" % context_data)
context_file.close()
continue
+ if TheAddressTable != None:
+ load_objs = parsed_file.getElementsByTagName("load_obj")
+ for load_obj in load_objs:
+ global TheAddressTable
+ obj = getTextOf(load_obj, "obj")
+ ip = getTextOf(load_obj, "ip")
+ TheAddressTable.AddBinaryAt(obj, ip)
+
+ raw_errors = parsed_file.getElementsByTagName("error")
+ for raw_error in raw_errors:
+ # Ignore "possible" leaks for now by default.
+ if (show_all_leaks or
+ getTextOf(raw_error, "kind") != "Leak_PossiblyLost"):
+ error = ValgrindError(source_dir, raw_error)
+ self._errors.add(error)
+
if len(badfiles) > 0:
logging.warn("valgrind didn't finish writing %d files?!" % len(badfiles))
for file in badfiles: