Bug 23799

Summary: sprint_ustack() returns empty strings while sprint_ubacktrace() does not
Product: systemtap Reporter: agentzh <agentzh>
Component: tapsetsAssignee: Unassigned <systemtap>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: unspecified   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:

Description agentzh 2018-10-19 18:59:52 UTC
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!
Comment 1 agentzh 2018-10-19 19:00:47 UTC
Oh, BTW, I'm using the latest stap master on x86_64 (Fedora 26, kernel 4.16.16).
Comment 2 agentzh 2018-10-19 21:15:03 UTC
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]
```
Comment 3 agentzh 2018-10-19 22:12:00 UTC
Committed a fix to master already.