2013-04-09 82 views
-5

我必須調試使用Delphi CodeGear 2009構建的應用程序,該應用程序是由我以外的人構建的,此人不再是該公司的一部分。創建共享內存時出錯

奇怪的問題,當我將項目加載到代碼齒輪和運行應實際工作的軟件,我得到一個錯誤:

在$ 753CB9BC第一次機會異常。例外類別例外, 消息'創建共享內存時出錯'全局\ {B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}(5)'。流程 OrderCenter.exe(836268)

我甚至無法運行在一步一步模式的軟件,好像之前我甚至進入RAN應用程序本身發生。我不知道如何解決這個錯誤,我當然可以看看代碼並理解它,也許修改它,但我肯定不明白如何修復這樣的錯誤沒有任何文檔在谷歌。我嘗試瀏覽谷歌和SO一段時間嘗試各種關鍵字組合,並沒有出來它。

我該如何去調試呢?我從哪裏開始尋找?


編輯#1

爲了澄清,我越來越甚至進入應用程序之前一個例外,它甚至不是調試的。我很樂意儘快粘貼堆棧跟蹤,以便每個人都可以看到它崩潰的位置。對最初沒有想到這一點抱歉。

我已經在Google上搜索確切的錯誤消息,但是我沒有發現任何接近有用的東西。下面是幾個例子:

http://www.google.ca/#hl=fr&output=search&sclient=psy-ab&q=Error+creating+shared+memory&oq=Error+creating+shared+memory

http://www.google.ca/#hl=fr&sclient=psy-ab&q=delphi+Error+creating+shared+memory&oq=delphi+Error+creating+shared+memory


編輯#2

謝謝你的花時間到指定有某種初始化程序的人,我搜索了所有文件,發現該程序並發現代碼在這裏崩潰:

if not AlreadyRunning(ProcessName, TFormMain, False, False, True) then 

如果我試着看這個代碼的聲明,它似乎確實試圖創建一個全局共享內存對象可能是某種互斥體,以防止雙重初始化。

我的第一個猜測是,我可以大概只是從事實溝的這部分代碼沒有任何直接後果,除了用戶現在將能夠運行2+相同的應用程序。

請注意,我想知道爲什麼這首先會失敗(Win7,管理員帳戶)?

PS:我沒能找到其中的錯誤,在第一次發生的原因是因爲應用程序在釋放模式,而不是在調試模式下,我花了一些時間和深UI搜索注意到它的下在文件管理器中創建配置。沒有別的指示我,我是在釋放模式,直到我試圖把斷點在應用程序的初始化部分,它不會停止......

回答

0

我張貼了這個答案,因爲編輯的問題,使其很難理解歷史。爲了理解異常消息的含義,Hat沒有看到代碼,向大衛提示,並向該塊的新人解釋OP。

似乎與大衛的幫助下,你已經找到了一些代碼,防止代碼重複的實例運行。如果您將其刪除,則可能不會招致其他處罰,但由於我們無法讀取您的代碼,因此我們無法確切地告訴您。另外我會注意到,對於本地開發人員(C++和Delphi),釋放和調試模式的概念是非常明顯的,對於那些不熟悉編譯器和本機代碼的人來說,可能更多的是微妙的。如果你打算維護一個Delphi應用程序,可能值得一本關於Delphi的書。這裏有更多的龍,如果這是你的第一個編譯/母語,水域會變得非常快。

最有可能的該代碼被垂死是這是一個元素或者:

(a)中複製,並從共同的Delphi技術的一些食譜粘貼,或

(b)一種組分或類的一部分甚至沒有被原作者編寫

此代碼可能有錯誤導致移動此組件代碼,例如在1998年,在Windows NT上爲Delphi 5編寫,以便它不再在Delphi XE3中運行,在WIndows 7或8. 這種現象並不是delphi獨有的,被稱爲「比特腐化」。換句話說,環境是一個移動的目標,舊的代碼經常會像這樣打破。在沒有Delphi知識的情況下修復這個問題,或者是一個PHP程序員所涉及的Win32 APIs,就像讓一個汽車修理工在我的肝臟上做手術一樣。我不會給那個人賠率。

不過這裏有一個計劃:

A.評論一下。

B.繼續測試!

嘿對不起在遐遐,現在我們甚至! ;-)

+0

沒問題,實際上,我認爲我討厭如此之多的這個應用程序的原因是因爲沒有在這裏工作代碼德爾福了,我卡住試圖瞭解一個IDE,我不習慣,與緊迫感,沒有文件,老闆在假期休假陪產假......這使得很多一次處理所有... – 2013-04-10 14:10:11

+3

僱用一個承包商。 (Nudge nudge,wink wink。) – 2013-04-10 14:11:05

+0

我注意到應用程序的幾個部分似乎使應用程序出錯,我的mysql連接引用了不存在的服務器和數據庫,代碼停止工作而以前等等。 。bla bla,好周! – 2013-04-10 14:11:24

15

錯誤是由你的程序特別提出。

異常類異常處理消息「錯誤創建共享存儲器全球\ {B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}(5)

具有所有:可以從該消息中辨別德爾菲計劃提出的例外標誌。十六進制表示爲$而不是0x,消息的第一個字是標準的Delphi。我會假設你的程序引發了這個異常。首先,異常類是Exception。據我所知,RTL或任何有信譽的第三方庫中都沒有提出類別Exception的例外。這被認爲是不好的做法。總是提出一個Exception的子類。 Ergo,你的應用程序的代碼引發了這個異常。

其次,消息描述在創建共享存儲器的誤差,並給出在Global命名空間中指定的對象。這可能是一個命名文件映射對象。

最後的消息包括由一呼叫檢索到GetLastError一個Win32錯誤代碼。該代碼是5號,我們的老朋友ERROR_ACCESS_DENIED

因此,看起來這個程序與一個單獨的進程串聯運行,並且使用共享內存,文件映射進行通信。並且該文件映射的安全性由於某種原因尚未正確設置。

對象已放置在Global命名空間,這是你做什麼,如果你需要它的會話之間共享。所以看起來合理的是,另一個進程駐留在會話0中的一個服務中。也許沒有正確指定保護用於跨會話訪問的對象所需的安全屬性。

是引發異常看起來有點像這樣的代碼:

FileMapping := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, 
    False, PChar(FileMappingName)); 
if FileMapping=0 then 
    raise Exception.CreateFormat(
    'Error creating shared memory %s (%d)', 
    [FileMappingName, GetLastError] 
); 

這是對所有我可以從提交的證據說。但是現在你知道在你的程序中搜索什麼,以便找到失敗的代碼。對你而言。

+2

優秀的調查工作,大衛。做得太好了。 – 2013-04-09 20:25:44

+2

基於答案的質量和實用性,我投票決定重新開放。這對於那些「逆轉」獎牌中的一個來說可能是一個很好的機會,如果OP會改善這個問題...... – 2013-04-09 20:38:17

+1

一個甚至無法找到Delphi中發生異常的地方的人,都要求太狹隘地定義一個問題在這裏很有用。請幫我的腳受傷,請幫我弄清楚什麼口徑的子彈已經在我的鞋子上打了一個洞。 Kthxbye。 – 2013-04-09 20:40:51