我是一个完整的golang初学者,实际上我正在调试其他人的程序以找出意外退出的原因。如何在golang退出前设置断点
我想知道如何在程序关闭之前调用的“exit”例程中设置断点gdb
?
到目前为止我试过
gdb <program name>
run
<...wait for program to quit>
break 'runtime.goexit'
run
<...wait for program to break>
但它不会破坏,而不是它只是退出。
我是一个完整的golang初学者,实际上我正在调试其他人的程序以找出意外退出的原因。如何在golang退出前设置断点
我想知道如何在程序关闭之前调用的“exit”例程中设置断点gdb
?
到目前为止我试过
gdb <program name>
run
<...wait for program to quit>
break 'runtime.goexit'
run
<...wait for program to break>
但它不会破坏,而不是它只是退出。
如果您有权访问的源代码,您可以添加一个defer
从任意点状处理退出:
https://play.golang.org/p/uliAc3j7f-
package main
import (
"fmt"
)
func main() {
defer func() {
fmt.Println("Place breakpoint here")
if recovered := recover(); recovered != nil {
fmt.Println("Handled panic:", recovered)
}
}()
fmt.Println("Hello, playground")
panic("Something went wrong")
}
还要区分大小写,尝试break 'runtime.Goexit'
- 见https://golang.org/pkg/runtime/#Goexit
有没有理由不在gdb中设置断点?我读了golang + gdb可能不稳定的地方。但我希望只是我不知道如何正确使用它。 –
对不起,我从来没有使用'gdb'所以不能回答你的问题。但也许你的问题与无效的案件 - Goexit从大写开始 - https://golang.org/pkg/runtime/#Goexit。试试'break'runtime.Goexit''? –
请尝试,谢谢! –
但它不会中断,而只是退出。
可以使用catch syscall exit
(或catch sycall exit_group
如果你是 在Linux上)。
如果程序确实存在(而不是被信号终止),则可以保证停止该程序。
它仅仅是退出还是恐慌(即转储堆栈跟踪时大声崩溃)? – kostix