1

gtkada を使用していて、GUI が実行されている場合、例外は管理されず、プログラムは常にクラッシュします。メッセージは

このアプリケーションは、異常な方法で終了するようランタイムに要求しました。

詳細については、アプリケーションのサポート チームにお問い合わせください。

テストコードは次のとおりです。

    with GLib;          use GLib;
    with Gtk.Label;     use Gtk.Label;
    with Gtk.Window;    use Gtk.Window;
    with Gtk.Frame;     use Gtk.Frame;
    with Gtk.Button;    use Gtk.Button;
    with Gtk.Widget;    use Gtk.Widget;

    with Gtk.Handlers;
    with Gtk.Main;


    procedure gui_test_4 is
       Window          : Gtk_Window;
       Label           : Gtk_Label;
       Frame           : Gtk_Frame;
       Button_S        : Gtk_Button;
       General_Error   : exception;

       package Handlers is new Gtk.Handlers.Callback (Gtk_Widget_Record);
       package Return_Handlers is
          new Gtk.Handlers.Return_Callback (Gtk_Widget_Record, Boolean);

       function Delete_Event (Widget : access Gtk_Widget_Record'Class)
          return Boolean is
       begin
          return False;
       end Delete_Event;

       procedure Destroy (Widget : access Gtk_Widget_Record'Class) is
       begin
          Gtk.Main.Main_Quit;
       end Destroy;

       procedure Clicked (Widget : access Gtk_Widget_Record'Class) is
       begin

          raise General_Error;
        exception
            when General_Error =>
              null;

       end Clicked;


    begin
       Gtk.Main.Init;
       Gtk.Window.Gtk_New (Window);
       Set_Default_Size (Window, 200, 200);
       Gtk.Window.Set_Title (Window, "GUI_Test_4");
       Gtk_New (Frame);
       Add (Window, Frame);
       Gtk_New (Button_S, "Try");
       Add (Frame, Button_S);

       Return_Handlers.Connect
       (  Window,
          "delete_event",
          Return_Handlers.To_Marshaller (Delete_Event'Access)
       );
       Handlers.Connect
       (  Window,
          "destroy",
          Handlers.To_Marshaller (Destroy'Access)
       );
       Handlers.Connect
       (  Button_S,
          "clicked",
          Handlers.To_Marshaller (Clicked'Access)
       );

       Show_All (Window);
       Show (Window);

       Gtk.Main.Main;

    end gui_test_4;

ボタンが押されると例外が発生しますが、同じ手順で処理する必要がありますが、その代わりにプログラム全体がクラッシュします。

この問題を解決する方法はありますか?

ありがとう

4

1 に答える 1

2

私にはデバッガーの仕事のように見えます。

コメントでは、他の人がこの同じコードを正常に実行してビルドできることが言及されていました。これは、GTKAda のバージョンに問題があることを意味している可能性があります。代わりに、実際のバグがそこにあることを意味する可能性がありますが、それがどのように表現されるかは、プログラムの起動時にどのメモリ領域にどのガベージ値がロードされたかによって異なります。

まず、GTKAda が最新バージョンであることを確認することから始めてください。しかしその後、デバッガーを起動して、どこでクラッシュするかを確認してください。Ada プログラムでは、メインのコードの最初の行が呼び出される前に、パッケージの作成中にクラッシュが発生することがよくあることに注意してください。Gnat を使用している場合は、GDB でも作成プロセスを進めることができます。他のコンパイラでは、ブレークポイントを早期にキャッチするためにブレークポイントを配置しようとする精緻なコードを見つける必要がある場合があります。

于 2012-09-11T18:39:52.623 に答える