#include <stdio.h>
int funcB(int a) {
    return a + 1;
}
 
int funcA(int b) {
    return funcB(b);
}
int main(int argc, char* argv[]) {
    int a = funcA(1);
    return 0;
}

Test program for call stack

gdb tracing.

(gdb) disas main
Dump of assembler code for function main:
   0x0000000000400578 <+0>:     stp     x29, x30, [sp, #-48]!
   0x000000000040057c <+4>:     mov     x29, sp
   0x0000000000400580 <+8>:     str     w0, [sp, #28]
   0x0000000000400584 <+12>:    str     x1, [sp, #16]
   0x0000000000400588 <+16>:    mov     w0, #0x1                        // #1
   0x000000000040058c <+20>:    bl      0x40055c <funcA>
   0x0000000000400590 <+24>:    str     w0, [sp, #44]
   0x0000000000400594 <+28>:    mov     w0, #0x0                        // #0
   0x0000000000400598 <+32>:    ldp     x29, x30, [sp], #48
   0x000000000040059c <+36>:    ret
End of assembler dump.
(gdb) disas funcA
Dump of assembler code for function funcA:
   0x000000000040055c <+0>:     stp     x29, x30, [sp, #-32]!
   0x0000000000400560 <+4>:     mov     x29, sp
   0x0000000000400564 <+8>:     str     w0, [sp, #28]
   0x0000000000400568 <+12>:    ldr     w0, [sp, #28]
   0x000000000040056c <+16>:    bl      0x400544 <funcB>
   0x0000000000400570 <+20>:    ldp     x29, x30, [sp], #32
   0x0000000000400574 <+24>:    ret
End of assembler dump.
(gdb) disas funcB
Dump of assembler code for function funcB:
   0x0000000000400544 <+0>:     sub     sp, sp, #0x10
   0x0000000000400548 <+4>:     str     w0, [sp, #12]
   0x000000000040054c <+8>:     ldr     w0, [sp, #12]
   0x0000000000400550 <+12>:    add     w0, w0, #0x1
   0x0000000000400554 <+16>:    add     sp, sp, #0x10
   0x0000000000400558 <+20>:    ret
End of assembler dump.
Breakpoint 1, main (argc=1, argv=0xffffffffefd8) at test.c:12
12          int a = funcA(1);
(gdb) si
0x000000000040058c      12          int a = funcA(1);
(gdb) p $sp
$4 = (void *) 0xffffffffee50
(gdb) si
funcA (b=65535) at test.c:8
8       int funcA(int b) {
(gdb) p $sp
$5 = (void *) 0xffffffffee50
(gdb) si
0x0000000000400560      8       int funcA(int b) {
(gdb) p $sp
$6 = (void *) 0xffffffffee30
(gdb) si
0x0000000000400564      8       int funcA(int b) {
(gdb) p $sp
$7 = (void *) 0xffffffffee30
(gdb) si
9           return funcB(b);
(gdb) p $sp
$8 = (void *) 0xffffffffee30
(gdb) si
0x000000000040056c      9           return funcB(b);
(gdb) p $sp
$9 = (void *) 0xffffffffee30
(gdb) si
funcB (a=65535) at test.c:4
4       int funcB(int a) {
(gdb) p $sp
$10 = (void *) 0xffffffffee30
(gdb) si
0x0000000000400548      4       int funcB(int a) {
(gdb) p $sp
$11 = (void *) 0xffffffffee20
(gdb) si
5           return a + 1;
(gdb) p $sp
$12 = (void *) 0xffffffffee20
(gdb) si
0x0000000000400550      5           return a + 1;
(gdb) p $sp
$13 = (void *) 0xffffffffee20
(gdb) si
6       }
(gdb) p $sp
$14 = (void *) 0xffffffffee20
(gdb) si
0x0000000000400558      6       }
(gdb) p $sp
$15 = (void *) 0xffffffffee30
(gdb) si
funcA (b=1) at test.c:10
10      }
(gdb) p $sp
$16 = (void *) 0xffffffffee30
(gdb) si
0x0000000000400574      10      }
(gdb) p $sp
$17 = (void *) 0xffffffffee50
(gdb) si
0x0000000000400590 in main (argc=1, argv=0xffffffffefd8) at test.c:12
12          int a = funcA(1);
(gdb) p $sp
$18 = (void *) 0xffffffffee50

Reference