2012-01-09 60 views
12

我們已經構建了一個使用包和組件的應用程序。當我們調試應用程序時,IDE中的「事件日誌」通常會顯示我們的BPL正在加載而沒有調試信息(「無調試信息」)。這沒有意義,因爲我們所有的包和EXE都是用調試構建的。調試時Delphi應用程序有「無調試信息」

_(each project) | Options | Compiling_ 
[ x ] Assertions 
[ x ] Debug information 
[ x ] Local symbols 
Symbol reference info = "Reference info" 
[ ] Use debug .dcus 
[ x ] Use imported data references 

_(each project) | Options | Linking_ 
[ x ] Debug information 
Map file = Detailed 

我們有4個項目,全部建成與運行pacakges:

  1. Core.bpl
  2. Components.bpl
  3. Plugin.bpl(同時使用#1 &#2)
  4. MainApp.exe(使用#1)

個問題觀察

1)很多次,當我們調試中,Components.bpl裝有調試信息,但在「局部變量」窗口中的所有值均爲空白。如果將鼠標懸停在代碼中的變量上,則不會顯示彈出窗口,並且「評估」窗口也不顯示任何內容(「結果」窗格始終爲空)。

2)有時,事件日誌會顯示各種BPL的「無調試信息」。例如,如果我們激活Plugin.bpl項目並將其設置爲Run |參數的主機應用程序爲MainApp.exe,然後按F9,除了Plugin.bpl模塊外,所有模塊似乎都加載了「Has Debug Info」。加載時,事件日誌顯示「無調試信息」。但是,如果我們關閉應用程序並立即按F9,它將再次運行而不重新編譯任何內容,並且這次Plugin.bpl加載了調試(「有調試信息」)。

問題

1)什麼會導致 「局部變量」 窗口顯示值是多少?

2)爲什麼在BPL符合調試和所有調試文件(dcu,map等)可用時,BPL有時會加載沒有調試信息?

回答

2

對於我們的特殊情況,我們能夠通過將Core.pbl和Components.bpl組合到一個BPL中來解決這個問題。現在所有模塊都加載了調試信息,偶爾會出現Locals窗口不會顯示變量值的問題。

+2

結合BPLs擺脫問題不是一個好的解決方案。想象一下,如果您擁有數百個動態包,則無法將其合併爲一個BPL。 – 2012-10-05 02:02:43

+0

@ChauCheeYang - 我們有幾十個其他BPL。造成這個問題的只是這兩者的分離。在我們的例子中,將這兩者結合是可以接受的,而將其他幾十個分開......這可能與Components.bpl有很大關係,這很大程度上取決於Core.bpl。 – 2012-10-05 02:07:13

+0

您是否對'debug'和'release'配置使用optset reference? – 2012-10-05 08:29:15

2

您必須使用調試信息構建您的單獨包,並且您最終還希望在不進行調試的情況下構建它們 - 因此您將在兩個位置都擁有這兩個包。然後你想用調試信息構建你的應用程序項目。檢查您的路徑以確保您在調試項目構建中包含啓用了調試的軟件包源。這聽起來像你可能會包含沒有調試的包,因爲你包含錯誤的源代碼。你必須確保你沒有包含兩條路徑,如果Delphi在兩個地方找到相同的包,則選擇包含哪些內容。

+0

我們所有的項目都是使用debug進行編譯的,並且DEBUG和RELEASE都使用相同的輸出文件夾。因此,如果在沒有DEBUG的情況下構建軟件包,或者調試器正在查找任何軟件包的RELEASE版本,則不會出現問題。我們將檢查路徑,以確保正確找到調試DCU。感謝您的建議。 – 2012-01-09 21:54:58

+0

+1您的建議檢查路徑。這導致我打開調試模塊窗口,該窗口顯示調試符號的加載位置。這有助於引導我解決問題的想法(請參閱下面的答案)。 – 2012-01-11 07:57:45

4

我們在我們的項目中遇到過類似的問題。不幸的是,我們有幾十個bpl,所以我們不能將它們合併成一個。 我們遷移到XE2並更改了編譯目標的文件夾結構後出現此問題。 雖然很難說Delphi的新版本是否引入了這個問題,但我們可以通過添加在路徑環境變量中編譯bpls的文件夾來解決問題。使用IDE的路徑覆蓋功能。這種類型的配置在Delphi 2010中不是必需的...

4

我會用它描述我的問題。

我動態加載包使用LoadPackage函數。

我可以在SysInternals.com Process Monitor看到packagename.DCP打開並在LoadPackage處理後成功讀取 - 沒有文件I/O失敗,沒有嘗試在錯誤的地方找到它,沒有任何可疑的東西。 所以也許在DCP中有一些構造使IDE調試器變得瘋狂。我很喜歡當Turbo Debugger可用於德爾福

順便說一句,同樣是packagename.RSM就是這樣創建的。

然後(暫停在斷點或步驟跟蹤)我打開查看/調試Windows /模塊並查看最後一個模塊是我的 - 它有空的「符號信息」單元。我右鍵單擊它,選擇「重新加載符號」行動 - 這裏是從現在開始,我可以調試。

PS。不知道,如果這將幫助我調試初始化部分雖然 - 希望「break on load」菜單項將工作,即使動態LoadPackage調用...

PPS。它的確可以工作,即使在IDE重啓時也是如此。所以現在我在BPL加載,i strike CTRL+ALT+M,滾動到底部找到我的BPL,點擊到Reload Symbols,按回車,然後關閉ModulesCPU點擊和點擊F9 (Run)。在initialization部分完成後,我再次通過CPU View - 只有幾個JMP s退出LoadPackage - 因此我再次關閉CPU ViewF9。非常乏味,但仍然比IDE重啓更好。

+0

不回答*爲什麼*調試信息丟失,但爲有用的解決方法+1。這比重啓Delphi並反覆嘗試,直到它終於起作用要好得多。 – 2012-10-03 16:24:29

+0

它不會丟失,它存在於BPL中--CFF資源管理器顯示這一點。 事實是,IDE不使用它 - 它使用DCP文件來代替。如果有幾個DCP文件 - 那麼它會失敗。然而,爲什麼有時甚至在唯一的DCP出現時就會失敗,並且它清楚地讀取了該文件 - 這是神祕的。在我的情況下,我發現同名單位EXE:Path1 \ name和BPL1:Path2 \ name - 但是BPL1和BPL2已加載並且只有動態加載的BPL3受到影響。無論如何,SysInit單元將被克隆在所有EXE/DLL/BPL文件中,以免混淆IDE調試器。謎。 PS thx 2u注意模塊視圖 – 2012-10-03 16:34:00

+0

不客氣 - 但我從來沒有嘗試右鍵單擊以告訴它'重新加載符號'。這是一個不錯的新技巧。 – 2012-10-03 16:42:08

2

這個問題可能是相關型號到QC#109291

當德爾福IDE開始引進.dproj文件,並建立與選項設置配置,完善項目管理髮布的很多。

但是,它也有一個副作用,很難重播和捕捉,我認爲這是IDE中的錯誤。這個問題應該總是讓一些項目無法在IDE調試器中調試的用戶感到困惑。即使我們檢查項目中編譯器和鏈接選項的所有相關設置,調試器也不會在項目上激活。一些項目工程和一些項目沒有。我們甚至認爲是內存問題或CPU問題。

我注意到問題是由於.dproj文件設置不存儲正確的信息。

<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''"> 
    <Cfg_1>true</Cfg_1> 
    <CfgParent>Base</CfgParent> 
    <Base>true</Base> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''"> 
    <Cfg_2>true</Cfg_2> 
    <CfgParent>Base</CfgParent> 
    <Base>true</Base> 
</PropertyGroup> 

<Import Project="Release.optset" Condition="'$(Cfg_2)'!='' And Exists('Release.optset')"/> 
<PropertyGroup Condition="'$(Cfg_1)'!=''"> 
    <CfgDependentOn>Release.optset</CfgDependentOn> 
</PropertyGroup> 
<Import Project="Debug.optset" Condition="'$(Cfg_1)'!='' And Exists('Debug.optset')"/> 
<PropertyGroup Condition="'$(Cfg_2)'!=''"> 
    <CfgDependentOn>Debug.optset</CfgDependentOn> 
</PropertyGroup> 

Release.optset結合Cfg_2Debug.optset結合Cfg_1Release配置則採用了Cfg_1Debug配置使用Cfg_2:如果相關.dproj文件中有這樣的事情。

構建項目時,調試信息不​​會在調試配置中生成,而會在發佈配置中生成。

變通辦法解決方案已打開。用任何文本編輯器,但不德爾福IDE,並更新到dproj:

<Import Project="Release.optset" Condition="'$(Cfg_1)'!='' And Exists('Release.optset')"/> 
<PropertyGroup Condition="'$(Cfg_1)'!=''"> 
    <CfgDependentOn>Release.optset</CfgDependentOn> 
</PropertyGroup> 
<Import Project="Debug.optset" Condition="'$(Cfg_2)'!='' And Exists('Debug.optset')"/> 
<PropertyGroup Condition="'$(Cfg_2)'!=''"> 
    <CfgDependentOn>Debug.optset</CfgDependentOn> 
</PropertyGroup> 
+0

這看起來很有希望,但我將無法測試它,直到再次遇到調試信息丟失的情況。感謝您分享您的經驗。 – 2012-10-05 15:19:28

+0

是的。我通過刪除dproj文件並讓Delphi重新生成它來解決了許多問題。其中一個例子很多:http://stackoverflow.com/questions/21958575/access-violation-when-i-drop-a-tidsmtp-on-a-form – Ampere 2017-02-17 10:27:26

0

我在.dprj文件中Cfg_2一個符合其設置爲false值Debugger_LoadAllSymbols細節發現。我確實將它設置爲true。問題解決了。也許與您的情況不相似,但可能有所幫助。

<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> 
... 
    <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols> 
... 
</PropertyGroup> 
4

This non-official tool修復了Delphi的許多問題。它修復了我沒有調試信息的模塊加載。所有學分到magicandre1981

+0

我在Delphi中調試設計包時遇到了麻煩XE6,IDE不想加載調試信息。這個工具幫助,謝謝! – 2015-11-19 19:13:28

+0

我每次遇到斷點時也登陸'CPU'選項卡 - >我的bpl和app沒有調試信息加載。我安裝了這個工具,它工作。謝謝! – santiagoIT 2017-11-07 23:28:20