1#!/usr/bin/python 2# 3# nodejs_http_server Basic example of node.js USDT tracing. 4# For Linux, uses BCC, BPF. Embedded C. 5# 6# USAGE: nodejs_http_server PID 7# 8# Copyright 2016 Netflix, Inc. 9# Licensed under the Apache License, Version 2.0 (the "License") 10 11from __future__ import print_function 12from bcc import BPF, USDT 13from bcc.utils import printb 14import sys 15 16if len(sys.argv) < 2: 17 print("USAGE: nodejs_http_server PID") 18 exit() 19pid = sys.argv[1] 20debug = 0 21 22# load BPF program 23bpf_text = """ 24#include <uapi/linux/ptrace.h> 25int do_trace(struct pt_regs *ctx) { 26 uint64_t addr; 27 char path[128]={0}; 28 bpf_usdt_readarg(6, ctx, &addr); 29 bpf_probe_read_user(&path, sizeof(path), (void *)addr); 30 bpf_trace_printk("path:%s\\n", path); 31 return 0; 32}; 33""" 34 35# enable USDT probe from given PID 36u = USDT(pid=int(pid)) 37u.enable_probe(probe="http__server__request", fn_name="do_trace") 38if debug: 39 print(u.get_text()) 40 print(bpf_text) 41 42# initialize BPF 43b = BPF(text=bpf_text, usdt_contexts=[u]) 44 45# header 46print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "ARGS")) 47 48# format output 49while 1: 50 try: 51 (task, pid, cpu, flags, ts, msg) = b.trace_fields() 52 except ValueError: 53 print("value error") 54 continue 55 except KeyboardInterrupt: 56 exit() 57 printb(b"%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) 58