Skip to content

Commit

Permalink
Fixes for address calculation
Browse files Browse the repository at this point in the history
The calculation of function address in non-shared libraries was
incorrect. Fix it.

Signed-off-by: Brenden Blanco <[email protected]>
  • Loading branch information
Brenden Blanco committed Jan 28, 2016
1 parent 948cefe commit 7468195
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 33 deletions.
2 changes: 1 addition & 1 deletion src/cc/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ static int bpf_attach_tracing_event(int progfd, const char *event_path,
attr.wakeup_events = 1;
pfd = syscall(__NR_perf_event_open, &attr, pid, cpu, group_fd, PERF_FLAG_FD_CLOEXEC);
if (pfd < 0) {
perror("perf_event_open");
fprintf(stderr, "perf_event_open(%s/id): %s\n", event_path, strerror(errno));
goto error;
}
perf_reader_set_fd(reader, pfd);
Expand Down
2 changes: 1 addition & 1 deletion src/python/bcc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ def _check_path_symbol(cls, name, sym, addr):
if not addr:
raise Exception("could not determine address of symbol %s" % sym)

return (path, load_addr+addr)
return (path, addr-load_addr)

def attach_uprobe(self, name="", sym="", addr=None,
fn_name="", pid=-1, cpu=0, group_fd=-1):
Expand Down
37 changes: 6 additions & 31 deletions tests/cc/test_uprobes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,8 @@
import bcc
import ctypes
import os
import re
import struct
import time
import unittest

## code from ctypes impl
#if struct.calcsize("l") == 4:
# machine = os.uname()[4] + "-32"
#else:
# machine = os.uname()[4] + "-64"
#mach_map = {
# "x86_64-64": "libc6,x86-64",
# "ppc64-64": "libc6,64bit",
# "sparc64-64": "libc6,64bit",
# "s390x-64": "libc6,64bit",
# "ia64-64": "libc6,IA-64",
#}
#abi_type = mach_map.get(machine, "libc6")
#
#def find_library_fullpath(name):
# expr = r"\s+lib%s\.[^\s]+\s+\(%s, [^)]+[^/]+([^\s]+)" % (name, abi_type)
# with os.popen("/sbin/ldconfig -p 2>/dev/null") as f:
# data = f.read()
# res = re.search(expr, data)
# if not res:
# return None
# return res.group(1)

class TestUprobes(unittest.TestCase):
def test_simple_library(self):
text = """
Expand All @@ -58,6 +32,7 @@ def test_simple_library(self):
libc.malloc_stats.argtypes = []
libc.malloc_stats()
self.assertEqual(b["stats"][ctypes.c_int(0)].value, 2)
b.detach_uretprobe(name="c", sym="malloc_stats")
b.detach_uprobe(name="c", sym="malloc_stats")

def test_simple_binary(self):
Expand All @@ -74,14 +49,14 @@ def test_simple_binary(self):
incr(0);
return 0;
}"""
text = text.replace("PID", "%d" % os.getpid())
b = bcc.BPF(text=text)
b.attach_uprobe(name="/usr/bin/python2", sym="main", fn_name="count")
b.attach_uretprobe(name="/usr/bin/python2", sym="main", fn_name="count")
with os.popen("/usr/bin/python2 -V") as f:
b.attach_uprobe(name="/usr/bin/python", sym="main", fn_name="count")
b.attach_uretprobe(name="/usr/bin/python", sym="main", fn_name="count")
with os.popen("/usr/bin/python -V") as f:
pass
self.assertGreater(b["stats"][ctypes.c_int(0)].value, 0)
b.detach_uprobe(name="/usr/bin/python2", sym="main")
b.detach_uretprobe(name="/usr/bin/python", sym="main")
b.detach_uprobe(name="/usr/bin/python", sym="main")

if __name__ == "__main__":
unittest.main()

0 comments on commit 7468195

Please sign in to comment.