2013-04-09 154 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