当没有终端时捕获程序崩溃

当没有终端时捕获程序崩溃

这个问题可能总体上属于 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)

我很高兴,但是通过发射箱启动它......

KDE 启动框

窗口消失时不会出现任何有关程序崩溃的明显通知。在后一种情况下,我希望出现一条消息,告诉我类似

~/Skrivbord/gtktest/test导致了分段错误

就像我在 Windows 中看到的一样。

答案1

通过阅读man 5 core我发现了程序崩溃时会发生什么。通过设置core_pattern,我可以启动除此以外的其他apport程序fork- setuid- setgit- exec zenity

相关内容