Commit ce657b11 authored by Teng Qin's avatar Teng Qin

Fix TCPSendStack example stack id error handling

parent 5cf87883
...@@ -27,17 +27,15 @@ struct stack_key_t { ...@@ -27,17 +27,15 @@ struct stack_key_t {
int kernel_stack; int kernel_stack;
}; };
BPF_STACK_TRACE(stack_traces, 10240); BPF_STACK_TRACE(stack_traces, 16384);
BPF_HASH(counts, struct stack_key_t, uint64_t); BPF_HASH(counts, struct stack_key_t, uint64_t);
int on_tcp_send(struct pt_regs *ctx) { int on_tcp_send(struct pt_regs *ctx) {
struct stack_key_t key = {}; struct stack_key_t key = {};
key.pid = bpf_get_current_pid_tgid() >> 32; key.pid = bpf_get_current_pid_tgid() >> 32;
bpf_get_current_comm(&key.name, sizeof(key.name)); bpf_get_current_comm(&key.name, sizeof(key.name));
key.kernel_stack = stack_traces.get_stackid(ctx, BPF_F_REUSE_STACKID); key.kernel_stack = stack_traces.get_stackid(ctx, 0);
key.user_stack = stack_traces.get_stackid( key.user_stack = stack_traces.get_stackid(ctx, BPF_F_USER_STACK);
ctx, BPF_F_REUSE_STACKID | BPF_F_USER_STACK
);
u64 zero = 0, *val; u64 zero = 0, *val;
val = counts.lookup_or_init(&key, &zero); val = counts.lookup_or_init(&key, &zero);
...@@ -76,6 +74,12 @@ int main(int argc, char** argv) { ...@@ -76,6 +74,12 @@ int main(int argc, char** argv) {
std::cout << "Probing for " << probe_time << " seconds" << std::endl; std::cout << "Probing for " << probe_time << " seconds" << std::endl;
sleep(probe_time); sleep(probe_time);
auto detach_res = bpf.detach_kprobe("tcp_sendmsg");
if (detach_res.code() != 0) {
std::cerr << detach_res.msg() << std::endl;
return 1;
}
auto table = auto table =
bpf.get_hash_table<stack_key_t, uint64_t>("counts").get_table_offline(); bpf.get_hash_table<stack_key_t, uint64_t>("counts").get_table_offline();
std::sort( std::sort(
...@@ -84,31 +88,42 @@ int main(int argc, char** argv) { ...@@ -84,31 +88,42 @@ int main(int argc, char** argv) {
std::pair<stack_key_t, uint64_t> b) { return a.second < b.second; }); std::pair<stack_key_t, uint64_t> b) { return a.second < b.second; });
auto stacks = bpf.get_stack_table("stack_traces"); auto stacks = bpf.get_stack_table("stack_traces");
int lost_stacks = 0;
for (auto it : table) { for (auto it : table) {
std::cout << "PID: " << it.first.pid << " (" << it.first.name << ") " std::cout << "PID: " << it.first.pid << " (" << it.first.name << ") "
<< "made " << it.second << "made " << it.second
<< " TCP sends on following stack: " << std::endl; << " TCP sends on following stack: " << std::endl;
std::cout << " Kernel Stack:" << std::endl;
if (it.first.kernel_stack >= 0) { if (it.first.kernel_stack >= 0) {
std::cout << " Kernel Stack:" << std::endl;
auto syms = stacks.get_stack_symbol(it.first.kernel_stack, -1); auto syms = stacks.get_stack_symbol(it.first.kernel_stack, -1);
for (auto sym : syms) for (auto sym : syms)
std::cout << " " << sym << std::endl; std::cout << " " << sym << std::endl;
} else } else {
std::cout << " " << it.first.kernel_stack << std::endl; // -EFAULT normally means the stack is not availiable and not an error
std::cout << " User Stack:" << std::endl; if (it.first.kernel_stack != -EFAULT) {
lost_stacks++;
std::cout << " [Lost Kernel Stack" << it.first.kernel_stack << "]"
<< std::endl;
}
}
if (it.first.user_stack >= 0) { if (it.first.user_stack >= 0) {
std::cout << " User Stack:" << std::endl;
auto syms = stacks.get_stack_symbol(it.first.user_stack, it.first.pid); auto syms = stacks.get_stack_symbol(it.first.user_stack, it.first.pid);
for (auto sym : syms) for (auto sym : syms)
std::cout << " " << sym << std::endl; std::cout << " " << sym << std::endl;
} else } else {
std::cout << " " << it.first.user_stack << std::endl; // -EFAULT normally means the stack is not availiable and not an error
if (it.first.user_stack != -EFAULT) {
lost_stacks++;
std::cout << " [Lost User Stack " << it.first.user_stack << "]"
<< std::endl;
}
}
} }
auto detach_res = bpf.detach_kprobe("tcp_sendmsg"); if (lost_stacks > 0)
if (detach_res.code() != 0) { std::cout << "Total " << lost_stacks << " stack-traces lost due to "
std::cerr << detach_res.msg() << std::endl; << "hash collision or stack table full" << std::endl;
return 1;
}
return 0; return 0;
} }
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