-g
컴파일 및 -bargs -E
과 결합하여 작업의 마지막 기회 예외 처리기를 사용해보십시오 (당신이 gnatmake
을 사용하는 경우 즉, 그렇지 않으면, gnatbind -E
).
void segv(void) {
char *zero = 0;
*zero = 0;
}
및
$ gnatmake call_segv.adb -g -bargs -E -largs segv.o -Wl,-no_pie
건물
을
with Ada.Exceptions;
with Ada.Text_IO; use Ada.Text_IO;
procedure Call_Segv is
task T;
task body T is
procedure Segv;
pragma Import (C, Segv);
begin
Put_Line ("calling segv ...");
Segv;
Put_Line ("... done.");
exception
when E : others =>
Put_Line ("... exception: "
& Ada.Exceptions.Exception_Information (E));
end T;
begin
null;
end Call_Segv;
포함 segv.c
와
내가 얻을
$ call_segv
calling segv ...
... exception: Exception name: CONSTRAINT_ERROR
Message: erroneous memory access
Call stack traceback locations:
0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0
스택 추적 해석
$ atos -o call_segv 0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0
__gnat_error_handler (in call_segv) + 53
0x7fff8ff8a948
segv (in call_segv) (segv.c:3)
call_segv__tTKB.3158 (in call_segv) (call_segv.adb:10)
system__tasking__stages__task_wrapper (in call_segv) + 406
0x7fff8ff9c7a0
(즉, 맥 OS X에서의
같은;
정상적으로 기기에서는
-Wl,-no_pie
이 필요하지 않으며
atos
대신
addr2line
을 사용합니다.
위가 정확히 내가 원하는 것입니다. 나는 당신의 두 유닛을 가져 와서'gcc -g -c segv.c'를 사용하여 segv.c를 컴파일 한 다음'gnatmake call_segv.adb -g -bargs -E -largs segv.o'를 호출하고'segv ...를 호출했습니다. n 처리되지 않은 예외로 실행이 종료되었습니다. \ n 예외 이름 : STORAGE_ERROR \ n 메시지 : s-intman.adb : 124 명시 적 raise \ n 호출 스택 추적 위치 : 0xb7fc7cb9 '로 되돌아갑니다. 이것은 본질적으로 내가 더 큰 응용 프로그램을 가지고있는 것과 같은 문제입니다. 아마도 내 설정에서 뭔가 잘못 됐습니까? 나는이 시점에서 내가 해결책에 가깝다고 느낀다. 정말 고마워. – prelic
어떤 OS/컴파일러를 사용하고 있습니까? 데비안 wheezy (GCC 4.6)에서는 맥과 매우 흡사하다. 즉, 태스크의 예외 핸들러에서 예외를 성공적으로 catch하고 '처리되지 않은 예외로 종료 됨'대신 유용한 추적을 얻습니다. Win XP와 GNAT GPL 2012를 사용하면'Execution terminated ... '을 얻을 수 있으며 추적 코드의 C 부분에 대한 유용한 해석이 없습니다. 인터넷 검색이 도움이되지 않습니다 (comp.lang.ada 스레드가 있었는데, 누군가 C와 같은 문제를보고했습니다). –
와우 매우 흥미 롭습니다 ... 우리는 RHEL5.4를 사용하고 있으며,'gcc -x Ada --version'는 4.1.2를 반환합니다. 나중에 더 나은 결과를 얻으려면 나중에 버전에서 시도 할 것입니다. 다시 한번 감사드립니다. – prelic