GDB否則說:
(gdb) list
1 #include <stdio.h>
2 #include <ucontext.h>
3 #include <unistd.h>
4
5 int main(int argc, const char *argv[]){
6 ucontext_t context;
7
8 getcontext(&context);
9 puts("Hello world");
10 //sleep(1);
(gdb) break 9
Breakpoint 1 at 0x4005bb: file test.c, line 9.
(gdb) run
Starting program: /home/dtarcatu/workspace/ctest/test
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$1 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$2 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$3 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$4 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world
Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9 puts("Hello world");
(gdb) print $rbp
$5 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$6 = (void *) 0x7fffffffdb60
我不熟悉這些內容處理功能,但它似乎setcontext
不推新幀到堆棧而是恢復堆棧正是它的方式。所以你最終只會陷入一個無限循環 - 沒有堆棧溢出...
當你嘗試時發生了什麼? – 2014-10-17 07:59:42
你可以在http://pubs.opengroup.org/onlinepubs/007908775/xsh/getcontext.html閱讀getcontext/setcontext描述。它提到setcontext只能恢復上下文,並沒有提到推送新堆棧幀的任何信息。 – SSC 2014-10-17 08:21:42
@MartinJames這是一個無限循環。它將繼續打印「Hello World」 – Ravi 2014-10-17 09:23:37