手动输错参数

问题描述 投票:0回答:0

我想写一个像

ucontext
这样的协程库来切换上下文,我想在协程退出时调用Scheduler::exit() func。我将 Scheduler::exit() 地址作为
rip
存储在协程堆栈中以实现此目的,并将 Scheduler 对象指针存储在
rip
(Scheduler::exit addrees) 上方的协程堆栈中,但我发现了
this pointer
那个程序集捕获的代码总是得到错误的值。

uco::Scheduler::exit():
    push   %rbp
    mov    %rsp,%rbp
    mov    %rdi,-0x8(%rbp)
    nop
    pop    %rbp
    ret

这是

Scheduler::exit
函数,我暂时没有在这个函数中写任何东西,只是为了检查这个函数是否可以捕获 Scheduler 对象的
this pointer

我认为一切正常,直到

mov    %rdi,-0x8(%rbp)
这条线。

下面

Scheduler::exit()
的调试信息,这是
rbp
寄存器在
mov    %rdi,-0x8(%rbp)
之前的输出。 0x55555555a0c0 是我想要的 Sheduler 对象,-0x8(%rbp) 应该是
M[R[rbp]-8](0x55555555a0c0)
吧?但是 %rdi 总是得到错误的值。

(gdb) x/40xb $rbp
0x55555556eeb8: 0xc8    0xee    0x56    0x55    0x55    0x55    0x00    0x00
0x55555556eec0: 0xc0    0xa0    0x55    0x55    0x55    0x55    0x00    0x00
0x55555556eec8: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x55555556eed0: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x55555556eed8: 0x21    0x00    0x00    0x00    0x00    0x00    0x00    0x00

卡在这上面一整天了。感谢您花费宝贵的时间。

所有代码只有大约 150 行。 https://github.com/Rainff9f58ff178/yuco/tree/dbc66289ea25d2ee29b5f5b9727d498a99ff00d7

c++ gcc coroutine
© www.soinside.com 2019 - 2024. All rights reserved.