2015-12-29 14 views
0

我是一個工程師,而不是代碼編寫者。 (來自法國,所以請原諒我有時候英語不好)所以我缺乏基礎知識,例如「gdb」:gdb聲稱它有哪些變量segfaults

一個Fortran程序,我正在用openmp子句開發segfaults。 我被gdb給出了程序無法到達的內存位置的地址,但我想知道違規變量的名稱,以幫助找到出錯的地方。

我該如何給出位於0x00002aaaaab455ca的變量的名稱,gdb在我的精確情況中表示?

感謝的, 大衛

我可能需要有一個gdb的劇本給我的所有變量的所有不會忽略,但我甚至不知道該怎麼做,無論是;你能給我一個地址在哪裏學習嗎?謝謝。

編輯:我使用gfortran這樣: $ gfortran input.f -g -freal-8實時的16 -o輸出

EDIT2:對不起,我當然用-fopenmp;而且我還在前面的彙編中使用了所有的警告,以便爲生產運行提供非常「乾淨」的代碼。 (我檢查一切可能,我只需要在變量的段錯誤的名字,爲了糾正它的指數計算)

+0

你如何編譯你的代碼?哪個編譯器?哪些標誌?相關代碼的外觀如何?請編輯你的問題。 –

+1

您沒有使用編譯器選項'-fopenmp',因此編譯器不使用OpenMP。嘗試使用'-fcheck = all',編譯器可能會發現問題而無需使用gdb。對於調試,我建議選項:'-fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck = all' –

+0

爲什麼在編輯時向我們顯示命令行1,然後說你實際上使用了別的東西?那你到底用了什麼?不要使用編輯1,編輯2,編輯3 ...但使它成爲一個好的和明確的問題。請閱讀如何在幫助部分提出一個好問題。 –

回答

1

你能給我一個地址在哪裏得知

這樣的問題在這裏是題外話,但是這裏是GDB上的book

你有兩個選擇:

  1. 您能夠掌握足夠的GDB調試這個問題,或者
  2. 你可以賄賂別人更熟悉這樣做對你。

假設你想要做的(1),這裏有一些命令可能對您有用:

  • where(告訴你在哪裏在節目中你崩潰)
  • x/i $pc(告訴你導致崩潰的指令)
  • info registers(這和上面一起應該給你你的程序試圖訪問的確切地址)
  • info localsinfo globalsinfo addr 0x....(給你一個本地和全局變量的列表,也可能告訴你你需要什麼關於崩潰地址)。

如果以上不夠,您應該編輯您的問題以顯示您有多遠(即來自上述命令的輸出),並且我們可能會幫助您更多。但是很難通過這種低速連接進行調試,因此您應該儘量找到離您更近的人(即使用選項(2))。

+1

好吧就業俄語,我會盡量按照你提到的(1),即「學習剛夠GDB來調試這個問題」;到現在爲止,我唯一知道的gdb是bt-backtrace;它向我展示了我的代碼的哪一行程序崩潰。所以我可以猜測哪個是有問題的數組,並更正其索引的計算。 (幾乎總是出現同樣的問題,或者其他的太容易) 但是,使用OPENMP時,它在主要的「PARALLEL DO」指令中崩潰,該指令列舉了程序中的所有變量,將它們或者PRIVATE賦值給一個單獨的線程,或者在所有線程之間共享。 (續...) – dva2tlse

+0

所以所有的變量都是在同一條指令上命名的,我無法猜出其中哪一個出錯了。 順便說一句,我不介意在如此緩慢的連接上進行調試,它給了我足夠的提示,並且真的沒有人能夠幫助我,因爲即使我公司沒有人知道fortran。 再見, 大衛 – dva2tlse

+0

@ dva2tlse請再讀我的答案*。你的問題不太可能與變量有關。你的*第一步*應該看看導致崩潰的指令。直到你告訴我們這個指令是什麼(以及寄存器的值),沒有其他幫助可以給你。 –