blob: e95886344706c59b303b56aba93669e0a830e24f [file] [log] [blame] [raw]
package t::StapThread;
use strict;
use warnings;
our $GCScript = <<'_EOC_';
global ids, cur
global in_req = 0
global alive_reqs
function gen_id(k) {
if (ids[k]) return ids[k]
ids[k] = ++cur
return cur
}
F(ngx_http_handler) {
if (!alive_reqs[$r] && $r == $r->main) {
in_req++
alive_reqs[$r] = 1
if (in_req == 1) {
delete ids
cur = 0
}
}
}
F(ngx_http_free_request) {
if (alive_reqs[$r]) {
in_req--
delete alive_reqs[$r]
}
}
F(ngx_http_terminate_request) {
if (alive_reqs[$r]) {
in_req--
delete alive_reqs[$r]
}
}
M(http-lua-user-thread-spawn) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("spawn user thread %x in %x\n", c, p)
}
M(http-lua-thread-delete) {
t = gen_id($arg2)
printf("delete thread %x\n", t)
}
M(http-lua-user-coroutine-create) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("create %x in %x\n", c, p)
}
M(http-lua-coroutine-done) {
t = gen_id($arg2)
printf("terminate %d: %s\n", t, $arg3 ? "ok" : "fail")
#print_ubacktrace()
}
_EOC_
our $StapScript = <<'_EOC_';
global ids, cur
global timers
global in_req = 0
global co_status
global alive_reqs
function gen_id(k) {
if (ids[k]) return ids[k]
ids[k] = ++cur
return cur
}
F(ngx_http_handler) {
if (!alive_reqs[$r] && $r == $r->main) {
in_req++
alive_reqs[$r] = 1
printf("in req: %d\n", in_req)
if (in_req == 1) {
delete ids
cur = 0
co_status[0] = "running"
co_status[1] = "suspended"
co_status[2] = "normal"
co_status[3] = "dead"
}
}
}
F(ngx_http_free_request) {
if (alive_reqs[$r]) {
in_req--
println("free request")
delete alive_reqs[$r]
}
}
F(ngx_http_terminate_request) {
if (alive_reqs[$r]) {
in_req--
println("terminate request")
delete alive_reqs[$r]
}
}
F(ngx_http_lua_post_thread) {
id = gen_id($coctx->co)
printf("post thread %d\n", id)
}
M(timer-add) {
timers[$arg1] = $arg2
printf("add timer %d\n", $arg2)
}
M(timer-del) {
printf("delete timer %d\n", timers[$arg1])
delete timers[$arg1]
}
M(timer-expire) {
printf("expire timer %d\n", timers[$arg1])
delete timers[$arg1]
}
F(ngx_http_lua_sleep_handler) {
printf("sleep handler called\n")
}
F(ngx_http_lua_run_thread) {
id = gen_id($ctx->cur_co_ctx->co)
printf("run thread %d\n", id)
#if (id == 1) {
#print_ubacktrace()
#}
}
probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {
id = gen_id($L)
printf("lua resume %d\n", id)
}
M(http-lua-user-thread-spawn) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("spawn uthread %x in %x\n", c, p)
}
M(http-lua-thread-delete) {
t = gen_id($arg2)
uthreads = @cast($arg3, "ngx_http_lua_ctx_t")->uthreads
printf("delete thread %x (uthreads %d)\n", t, uthreads)
#print_ubacktrace()
}
M(http-lua-run-posted-thread) {
t = gen_id($arg2)
printf("run posted thread %d (status %s)\n", t, co_status[$arg3])
}
M(http-lua-user-coroutine-resume) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("resume %x in %x\n", c, p)
}
M(http-lua-thread-yield) {
t = gen_id($arg2)
printf("thread %d yield\n", t)
}
/*
F(ngx_http_lua_coroutine_yield) {
printf("yield %x\n", gen_id($L))
}
*/
M(http-lua-user-coroutine-yield) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("yield %x in %x\n", c, p)
}
F(ngx_http_lua_atpanic) {
printf("lua atpanic(%d):", gen_id($L))
print_ubacktrace();
}
F(ngx_http_lua_run_posted_threads) {
printf("run posted threads\n")
}
F(ngx_http_finalize_request) {
printf("finalize request %s: rc:%d c:%d a:%d\n", ngx_http_req_uri($r), $rc, $r->main->count, $r == $r->main);
#if ($rc == -1) {
#print_ubacktrace()
#}
}
F(ngx_http_lua_post_subrequest) {
printf("post subreq: %s rc=%d, status=%d a=%d\n", ngx_http_req_uri($r), $rc,
$r->headers_out->status, $r == $r->main)
#print_ubacktrace()
}
M(http-subrequest-done) {
printf("subrequest %s done\n", ngx_http_req_uri($r))
}
M(http-subrequest-wake-parent) {
printf("subrequest wake parent %s\n", ngx_http_req_uri($r->parent))
}
M(http-lua-user-coroutine-create) {
p = gen_id($arg2)
c = gen_id($arg3)
printf("create %x in %x\n", c, p)
}
F(ngx_http_lua_ngx_exec) { println("exec") }
F(ngx_http_lua_ngx_exit) { println("exit") }
F(ngx_http_lua_ffi_exit) { println("exit") }
F(ngx_http_lua_req_body_cleanup) {
println("lua req body cleanup")
}
F(ngx_http_read_client_request_body) {
println("read client request body")
}
F(ngx_http_lua_finalize_coroutines) {
println("finalize coroutines")
}
F(ngx_http_lua_ngx_exit) {
println("ngx.exit() called")
}
F(ngx_http_lua_ffi_exit) {
println("ngx.exit() called")
}
F(ngx_http_lua_sleep_resume) {
println("lua sleep resume")
}
M(http-lua-coroutine-done) {
t = gen_id($arg2)
printf("terminate coro %d: %s, waited by parent:%d, child cocotx: %p\n", t, $arg3 ? "ok" : "fail", $ctx->cur_co_ctx->waited_by_parent, $ctx->cur_co_ctx)
//print_ubacktrace()
}
F(ngx_http_lua_ngx_echo) {
println("ngx.print or ngx.say")
}
F(ngx_http_lua_del_all_threads) {
println("del all threads")
}
/*
M(http-lua-info) {
msg = user_string($arg1)
printf("lua info: %s\n", msg)
}
*/
M(http-lua-user-thread-wait) {
p = gen_id($arg1)
c = gen_id($arg2)
printf("lua thread %d waiting on %d, child coctx: %p\n", p, c, $sub_coctx)
}
_EOC_
1;