Commit 7468195f authored by Brenden Blanco's avatar Brenden Blanco

Fixes for address calculation

The calculation of function address in non-shared libraries was
incorrect. Fix it.
Signed-off-by: default avatarBrenden Blanco <bblanco@plumgrid.com>
parent 948cefe1
......@@ -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);
......
......@@ -765,7 +765,7 @@ class BPF(object):
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):
......
......@@ -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 = """
......@@ -58,6 +32,7 @@ int count(struct pt_regs *ctx) {
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):
......@@ -74,14 +49,14 @@ int count(struct pt_regs *ctx) {
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()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment