调试 C 共享库 (Go) 在 HTTPS.Post() 调用上挂起
Go C 共享库时会出现问题(使用 -buildmode=c-shared 构建)挂在 https.Post() 上。当代码构建为可执行文件时,不会出现此问题。
要调试和解决此问题,请考虑以下事项:
使用 Stracing 进行故障排除:
strace -fp PID
此命令可能会显示程序卡在 futex() 调用中。
使用 ListenAndServe 进行高级分析:
http.ListenAndServe("localhost:6060", nil) http.Post()
如果程序挂在 http.Post() 上,则可能表明探查器被阻止。
分析堆栈跟踪:
http.Post() 挂在 futex() 调用上,该调用用于同步 goroutine。堆栈跟踪显示 goroutine 在runtime.futexsleep() 和runtime.notesleep() 处被阻塞。
解决方案:控制Go 运行时加载
解决方案在于控制Go运行时的加载时间。当与 C 或 C 应用程序链接时,Go 运行时会在应用程序启动后立即加载。然而,在分叉进程中,这种行为可能会导致不可预测的结果。
通过使用 dlopen 和 dlsym,您可以在 fork() 调用后加载 Go 共享库,并控制 Go 运行时的加载时间。这种方法确保了分叉进程中的可预测行为。
以上是以下是一些标题选项,可以抓住文章的本质并将其框架为一个问题: **选项1(关注问题):** * **为什么 L 时我的 Go C 共享库会挂在 https.Post() 上的详细内容。更多信息请关注PHP中文网其他相关文章!