2017-10-20 197 views
0

我是一个完整的golang初学者,实际上我正在调试其他人的程序以找出意外退出的原因。如何在golang退出前设置断点

我想知道如何在程序关闭之前调用的“exit”例程中设置断点gdb

到目前为止我试过

gdb <program name> 
run 
<...wait for program to quit> 
break 'runtime.goexit' 
run 
<...wait for program to break> 

但它不会破坏,而不是它只是退出。

+0

它仅仅是退出还是恐慌(即转储堆栈跟踪时大声崩溃)? – kostix

回答

0

如果您有权访问的源代码,您可以添加一个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

+0

有没有理由不在gdb中设置断点?我读了golang + gdb可能不稳定的地方。但我希望只是我不知道如何正确使用它。 –

+0

对不起,我从来没有使用'gdb'所以不能回答你的问题。但也许你的问题与无效的案件 - Goexit从大写开始 - https://golang.org/pkg/runtime/#Goexit。试试'break'runtime.Goexit''? –

+0

请尝试,谢谢! –

0

但它不会中断,而只是退出。

可以使用catch syscall exit(或catch sycall exit_group如果你是 在Linux上)。

如果程序确实存在(而不是被信号终止),则可以保证停止该程序。