Consider the following minimal C program: ``` int foo(void) { return 3; } int bar(void) { return foo(); } int main(void) { bar(); return 0; } ``` Compile and link it like this: ``` gcc -g test.c ``` And then run the following stap oneliner: ``` stap -e 'probe process.function("foo") { printf("{%s}\n{%s}", sprint_ustack(ubacktrace()), sprint_ubacktrace()); }' -c ./a.out --ldd ``` And the output is ``` {} {foo+0x4 [a.out] bar+0x9 [a.out] main+0x9 [a.out] __libc_start_main+0xea [libc-2.26.so] _start+0x2a [a.out]} ``` The weird thing is that `sprint_ustack(ubacktrace())` returns an empty string while `sprint_ubacktrace()` does not. Why the difference? Is there a bug in `sprint_ustack()`? Any hints on debugging this thing? Thanks!
Oh, BTW, I'm using the latest stap master on x86_64 (Fedora 26, kernel 4.16.16).
Using `print_ustack(ubacktrace())` works: ``` $ stap -e 'probe process.function("foo") { print_ustack(ubacktrace()); }' -c ./a.out --ldd 0x40048b : foo+0x4/0xb [/mnt/home/agentzh/git/ylang/a.out] 0x40049b : bar+0x9/0xb [/mnt/home/agentzh/git/ylang/a.out] 0x4004a6 : main+0x9/0x13 [/mnt/home/agentzh/git/ylang/a.out] 0x7f3e87d0ffea : __libc_start_main+0xea/0x1c0 [/usr/lib64/libc-2.26.so] 0x4003da : _start+0x2a/0x30 [/mnt/home/agentzh/git/ylang/a.out] ```
Committed a fix to master already.