2011-03-28 4 views
0

테스트를 위해 3 HP-UX PA RISC 기계를 사용 중입니다. 내 바이너리가 다른 PA RISC 시스템에서 작동하지 않습니다. 바이너리가 버전 확인으로 실행 되더라도 버전을 출력하고 종료하고 다른 작업을 수행하지 않더라도 여전히 바이너리가 세그먼테이션 오류를 제공합니다. 세그멘테이션 오류의 원인은 무엇입니까? 하나의 상자에서 오류의 근본 원인을 찾는 것이 중요합니다. 프로그램이 2 HP-UX에서 작동하기 때문에 환경 문제가있는 것 같습니다.HP-UX PA RISC에서 64 비트 프로그램 세그먼트 화 오류

테스트 프로그램에서 동일한 코드 조각 (예 : 변수 선언, 버전 인쇄 및 종료)을 복사하고 동일한 컴파일 옵션을 사용하여 빌드했지만 작동 중입니다. 다음은 프로그램의 gdb 출력입니다.

$ gdb prg_us 
Detected 64-bit executable. 
Invoking /opt/langtools/bin/gdb64. 
HP gdb 5.4.0 for PA-RISC 2.0 (wide), HP-UX 11.00 
and target hppa2.0w-hp-hpux11.00. 
Copyright 1986 - 2001 Free Software Foundation, Inc. 
Hewlett-Packard Wildebeest 5.4.0 (based on GDB) is covered by the 
GNU General Public License. Type "show copying" to see the conditions to 
change it and/or distribute copies. Type "show warranty" for warranty/support. 
.. 
(gdb) b 5573 
Breakpoint 1 at 0x4000000000259e04: file pmgreader.c, line 5573 from /tmp/test/prg_us. 
(gdb) r -v 
Starting program: /tmp/test/prg_us -v 

Breakpoint 1, main (argc=2, argv=0x800003ffbfff05f8) at pmgreader.c:5573 
5573  if (argc ==2 && strcmp (argv[1], "-v") == 0) 
Current language: auto; currently c++ 
(gdb) n 
5575   printf ("%s", VER); 
(gdb) n 
5576   exit(0); 
(gdb) n 

Program received signal SIGSEGV, Segmentation fault 
    si_code: 0 - SEGV_UNKNOWN - Unknown Error. 
0x800003ffbfb9e130 in real_free+0x480() from /lib/pa20_64/libc.2 
(gdb) 

가능한 원인은 무엇입니까? 왜 다른 회사가 아닌 다른 회사에서 일하고 있습니까?

+1

관련 코드 중 일부를 게시해야합니다. 메인 라인의 시작부터 문제 라인을 넘어선 몇 줄까지. –

+0

@Paul : 실제 코드는 더 크다. 이 경우, main 함수가 시작될 때 prog가 -v 인수로 호출되는지 여부를 확인하고, 예이면 VER을 출력하고 종료합니다. 이것은 HP-UX PA RISC를 포함한 모든 유닉스 환경에서 작동하지만 하나의 HP-UX PA RISC 시스템에서는 실패합니다. – Sach

+0

스택 추적이 필요합니다. 그것은 당신에게 대답을 말할 것입니다. 기본적으로 그래픽 디버거를 사용하면 훨씬 쉽게 될 것입니다. 이미 설치되어있을 것입니다. 그렇지 않다면 Emacs는 작업을 수행하는 작업을 수행합니다. – Ben

답변

0

그냥 장거리 슛 - 당신이 모두 stdio.hprintf()exit()의 프로토 타입이 컴파일러에게 잘 알려져있다 stdlib.h 포함되어 있습니까?

실제로 C++이 혼합되어 있다는 사실을 조금 더 생각한 후에는 정적 객체 초기화가 문제를 일으킬 수 있습니다 (힙이 손상 될 수 있음).

불행히도 valgrind가 PA-RISC에서 지원되지 않는 것 같습니다. PA-RISC에서 유사한 도구를 실행할 수 있습니까? 그렇지 않다면 x64 빌드에서 valgrind를 실행하는 것이 가치가있을 수 있습니다.

0

마이클 버는 이미 문제를 암시했다. 그것은 글로벌 객체이다.

충돌이 free 함수에서 발생한 것입니다. 이는 메모리 할당 해제 및 소멸자를 나타냅니다. 전역 파괴자는 exit(0) 이후에 실행됩니다. 스택 트레이스에 더 자세한 정보가 표시됩니다.