我使用的代碼塊時:獲取分割故障運行的發行版本,而不是調試版本代碼塊
Release 13.12 rev 9501 (2013-12-25 18:25:45) gcc 4.8.2 Linux/unicode - 64 bit
在以下系統:
Linux Mint 17.3 Cinnamon (version 2.8.7) 64-bit
Intel Core i7-4790
NVIDIA GeForce GTX 750 Ti
當我設置選擇目標「調試」並運行我的代碼,它完美的工作。我已經運行了很多次,沒有任何問題。但是,當我選擇「釋放」目標並經常從命令提示符運行程序時,會出現分段錯誤。
我的C++程序大約有一千行,我不知道程序的哪一部分導致了分段錯誤。所以我不知道在這個階段哪個代碼是相關的(當我有更多的信息時,我會在這裏發佈一些代碼)。它確實利用指針和動態數據結構。我猜測有些東西沒有被正確初始化,但是我不知道如何去調試「Release」版本。我沒有改變任何編譯器或鏈接器設置的默認值。 「版本」版本中可能會有什麼不同導致此問題?
(更新)按照Nathan的建議,我能夠找出分段故障。有一個for循環,但在這個循環中的某些情況下上限(終點指標)沒有被初始化,沿着線:
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
我能解決這個問題,通過初始化的「end_idx 「變到零(」 st_idx」總是大於一):
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
else
end_idx = 0;
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
是否有可能獲得代碼塊/ GCC編譯器,當一個變量沒有被初始化這樣發出警告?我看到有一個GCC選項: - 初始化,但我沒有看到這在Code Blocks中。
使用一些'cout'語句來標記代碼塊。一旦你錯了,你至少應該知道什麼阻止了它,然後你從那裏縮小它的範圍。但你是對的。這很可能意味着你的代碼中有一些UB。 – NathanOliver