2010-05-20 88 views
7

我在我的項目中有一個源文件,它有超過65,536個代碼行(確切地說是112,444)。我正在使用一個「sqlite合併」,它來自一個巨大的源文件。巨大的C文件調試問題

我正在使用MSVC 2005.問題在調試期間到達。一切編譯和鏈接好。但是當我試圖用調試器進入一個函數時 - 它顯示了不正確的代碼行。

有趣的是,正確的行號和調試器顯示的行號之間的差異恰恰是65536.這使我懷疑(幾乎可以肯定)一些無符號的短溢出。

我也懷疑它不是MSVC本身的錯誤。也許這是調試信息格式的限制。也就是說,MSVC使用的調試信息格式將行號存儲爲2字節短。

有沒有什麼可以做到這一點(除了將大文件切割成幾個較小的文件)?

+4

爲什麼調試sqlite合併? sqlite有一個適當的分佈,是許多單獨的文件。 – 2010-05-20 16:01:09

+0

如果它沒有損壞,請不要合併它。 – 2010-05-20 16:03:32

回答

8

根據一位MS調解員的說法,這只是一個調試器的已知問題(編譯器似乎正如你指出的那樣處理它)。顯然沒有解決方法,除了使用較短的源文件。請參見對非常類似問題的官方迴應here

0

如果您查看符號調試信息的文檔,您將看到用於行號的類型。例如,IDiaSession::findLinesByLinenumlinecolumn參數都是DWORD類型。

編輯:正如@valdo所指出的那樣,這並不意味着調試器可以正常工作,而且行數很大。所以你必須使用較短的文件。不幸的是,這種限制存在,但即使沒有,我仍然建議你分裂你的來源。

+0

好吧,讓我不同意。 IDiaSession/IDialSession接口用DWORD參數聲明的事實並不意味着用DWORD行號存儲的* actual *調試信息。該接口可能只是設計用於支持更大的行號,不一定是實現的。 – valdo 2010-05-20 19:11:11

0

除非你修改SQLite,否則你應該相信它正在完成它的工作。根本不需要介入。 SQLite在發佈之前會經過大量測試。

+2

像這樣的編輯可能應該是對這個問題的評論。這並不是試圖回答OP的問題,也不是試圖回答OP所固有的一般問題。 – 2010-05-20 22:02:34

0

你有沒有看過使用WinDBG呢?由於Windows團隊使用它來調試操作系統,並且存在一些biiiig文件,或者至少在我上次查看的時候,它的功能非常強大。

+0

還沒有。但是,正如我所說的,它似乎是調試信息格式的限制,而不是調試器中的一些錯誤 – valdo 2010-05-21 06:08:28

1

那麼,當我想看看sqlite是如何工作的時候,我拿走了最後的60000行,將它們移動到另一個文件,然後#include它。這很簡單,爲我做了訣竅。另外,如果你這樣做,注意不要在#ifdef裏面分割。

+1

該帖子說「(除了將大文件切割成幾個較小的文件)」。 – 2011-07-07 14:30:41

+0

這篇文章的確確實實在在地表達了這一點,但建議海報的前提條件或假設應該修改完全沒問題。將文件切分爲三部分(現在需要合併超過2 * 2^16行)是真正問題的完美解決方案,即使用符號調試器調試到SQLite代碼。我只需要自己做(爲什麼?因爲我需要找出原因,SQLite文檔中的任何地方都沒有文檔,以及我可以找到的其他地方沒有提到,某個SQLite函數失敗;我在5分鐘內就找到了)。 – 2014-01-31 14:36:03

0

對於有不正確行數的文件的人< 65536行:我發現我的問題是因爲源文件中的行不一致行尾。有123 \r換行符,其中文件的其餘部分是\r\n樣式。調試器行和正確行之間的差異也是129。