ターミナルがない場合にプログラムクラッシュをキャッチする

ターミナルがない場合にプログラムクラッシュをキャッチする

この質問は 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以外の何かを起動できます- - - 。apportforksetuidsetgitexec zenity

関連情報