-
Notifications
You must be signed in to change notification settings - Fork 689
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Assertion failed: (0), function coroutine_resume, file coroutine.c, line 155. 错误 #10
Comments
遇到同样的问题,coroutine_resume(S,co1) 调用 getcontext 这个函数时会修改 co2 里的内容,我猜测 macOS 里定义了不同的 ucontext_t,占用的内存更大,转换的过程中访问越界了。 |
ok. 搞懂了。 首先,应该引入 #include <ucontext.h>,而不是 <sys/ucontext.h>。因为使用到的函数并没有被声明在 <sys/ucontext.h> 里。因为某些原因编译通过了,但是类型估计是不同的。编译时加 flag 跳过检查:-D_XOPEN_SOURCE=600 其次,swapcontext 在 macOS 系统中的实现依赖于在栈上的返回地址,在调用 swapcontext 之前保存栈的信息会导致死循环。 这里是我修改后可以跑通的代码(在同一个函数里保存和 swap 就行了): |
. @Jeswang 测试了一下,发现你的修改还是有问题,例子程序里有一句
打印程序结束的信息,但是程序没有走到这里,说明中途出错了。整个程序的输出如下,供你参考。
在苹果的源代码里没看出所以然来。 https://github.com/Apple-FOSS-Mirror/Libc/blob/master/x86_64/gen/swapcontext.c |
Mac OS 10.14.7版本。
gcc info:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
在这个版本上编译,并运行代码生成的main 以后程序报告:
Assertion failed: (0), function coroutine_resume, file coroutine.c, line 155.
然后通过跟踪发现,main.c 里面
发现一个问题, struct coroutine 这个结构体的成员 ud 在程序resume coroutine的 co2的时候被修改了。
any idea for this?
The text was updated successfully, but these errors were encountered: