2011-03-28 16 views
0

我正在使用3 HP-UX PA RISC進行測試。我的二進制程序在一臺PA RISC機器上失效,而其他程序正在工作。請注意,儘管二進制文件是通過版本檢查來執行的,即它只是打印版本並退出並且不執行任何其他操作,但二進制文件仍然存在分段錯誤。分段故障的可能原因是什麼?在一個盒子裏找出失敗的根本原因對我來說很重要。由於程序正在使用2個HP-UX,它似乎是環境問題?HP-UX PA上的64位程序段分割錯誤RISC

我試圖在測試程序中複製同一段代碼(即聲明變量,打印版本和退出)並使用相同的編譯選項構建,但它正在工作。這是程序的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

您應該發佈一些相關的代碼,例如從主要開始到問題線以外的幾行。 – 2011-03-28 11:02:02

+0

@Paul:實際代碼較大。但是在這種情況下,在main函數的開始,我們檢查prog是否用-v參數調用,如果是,則打印VER並退出。這適用於所有unix版本,包括HP-UX PA RISC,但在一臺HP-UX PA RISC機器上運行失敗。 – Sach 2011-03-28 11:26:59

+0

您需要堆棧跟蹤。這會告訴你答案。基本上,如果你得到一個圖形調試器,這將變得更容易。你可能已經安裝了一個。如果沒有,Emacs有一個剛剛完成這項工作的人。 – Ben 2011-04-02 12:54:28

回答

0

只是一個長鏡頭 - 你既包括stdio.hstdlib.h所以printf()exit()的原型編譯器知道的?實際上,在經過了更多的思考(並注意到C++處於混合狀態)後,您可能會有一些靜態對象初始化導致問題(可能會破壞堆?)。

不幸的是,它看起來像在PA-RISC上不支持valgrind - 在PA-RISC上是否有一些類似的工具可以運行?如果沒有,那麼在你的程序的x64版本上運行valgrind可能是值得的,如果它不是很難設置的話。

0

Michael Burr已經暗示了這個問題:它是一個全局對象。

請注意,崩潰來自free函數。這表明內存釋放,並反過來析構函數。鑑於上下文,這是有道理的:全局析構函數在exit(0)之後運行。堆棧跟蹤將顯示更多細節。