这个问题可能总体上属于 Unix/Linux,但我猜答案取决于发行版或桌面环境 [我使用 KDE 和 Xfce,所以我想要一个适用于展位的答案]。
考虑这个简单的 GTK 应用程序:
#include <gtk/gtk.h>
static void print_hello(GtkWidget *widget, gpointer data)
{
g_print ("Hello World\n");
// Intentional crash
int* badfood=NULL;
*badfood=1;
}
int main(int argc,char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show (window);
GtkWidget* button = gtk_button_new_with_label ("Crash this app");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_main ();
return 0;
}
当用户点击“使此应用程序崩溃”时,程序将因 SIGSEGV 而崩溃。如果从终端运行,我会收到一条通知:
$ ~/Skrivbord/gtktest/test
Hello World
Segmenteringsfel (minnesutskrift skapad)
我很高兴,但是通过发射箱启动它......
窗口消失时不会出现任何有关程序崩溃的明显通知。在后一种情况下,我希望出现一条消息,告诉我类似
~/Skrivbord/gtktest/test
导致了分段错误
就像我在 Windows 中看到的一样。
答案1
通过阅读man 5 core
我发现了程序崩溃时会发生什么。通过设置core_pattern
,我可以启动除此以外的其他apport
程序fork
- setuid
- setgit
- exec
zenity
。