在 HTTPS.Post() 上调试悬挂的 Go C 共享库
在所描述的问题中,编写的 C 共享库Go 在尝试 HTTPS.Post() 时遇到挂起。虽然可执行二进制文件正确运行,但共享库在使用 http.Post() 或 net.Dial() 时遇到此问题。
初步调查:
堆栈跟踪:
SIGQUIT堆栈跟踪表明线程挂在runtime.futexsleep()上,用于线程同步。
可能的原因和解决方案:
正如已解决的答案中提到的,根本原因在于Go共享库的加载方式。当共享库链接到 C 或 C 应用程序时,Go 运行时会在应用程序启动期间初始化。如果应用程序分叉进程并尝试在分叉进程中使用 Go 库,这可能会导致不可预测的行为。
解决方案:
要解决此问题,可以使用以下方法:分叉发生后需要加载 Go 共享库。这可以通过使用动态链接技术(例如 dlopen() 和 dlsym())来实现。这种方法确保 Go 运行时仅在分叉进程中需要时才进行初始化。
结论:
挂起的 C 共享库的问题是由于导致 Go 运行时的过早初始化。通过在分叉后动态加载库,问题得到解决,并且共享库可以正常运行。
以上是## 如何调试 Fork 后挂在 HTTPS.Post() 上的 Go C 共享库?的详细内容。更多信息请关注PHP中文网其他相关文章!