2013-03-15 61 views
0

我已经更新了这个问题,并在下面开始执行摘要。然后,如果需要的话,会有详细的细节。感谢您的建议。VS2008 VS2010 - 有问题的配置和升级 - 新手

执行概要: 我是VS的新手。我有一些遗传代码的问题。代码在VS2008(XP64)上生成并运行良好。相同的代码将构建或不运行,或无法使用VS2008和/或VS2010在XP64或W7上构建。在改变了一些编译器选项后,我设法让它在XP64上的VS2010上运行时没有问题;然而,在W7上,没有运气。

我最终发现堆已损坏。

ae312i3.3.exe中的0x76e540f2(ntdll.dll)未处理的异常:0xC0000374:堆已损坏。

我不熟悉如何考虑修复堆问题;也许现有代码中的指针指向另一个线程或程序使用的内存,损坏了ntdll.dll文件,其他?

重新启动PC检查ntdll.dll是否损坏没有帮助。更改调试设置,并取得了以下意见:

HEAP [ae312i3.3.exe]:指定RtlSizeHeap(0000000000220000,000000002BC8BE58)无效的地址 Windows已经引发了ae312i3.3.exe一个断点。

这可能是由于堆的损坏,这表明ae312i3.3.exe或其中已加载的任何DLL错误。这也可能是由于用户按下F12而ae312i3.3.exe具有焦点。

似乎崩溃时,C++返回一个布尔变量的形式的表达式

While (myQueryFcn(inputvars))

  • 问题:

所以,是它不返回一个C布尔值到VB布尔值?我相信这两个是不同的表示(一个使用True/False,另一个是整数?)这可能是一个问题吗?如果是这样,为什么它不是在VB2008中的问题?**

或者,也许它是C++代码已写入分配的内存,并返回到VB时,它崩溃?

**我最近了解到'Insure ++',并试图用它来追踪这个问题。有关其使用的任何建议以及其他可能的见解? **

我将不胜感激任何建议。再次感谢。

。 。 。 。 。

细节LED向上述内容(下图):

我与VS2010新手;熟悉工程应用程序级别的编程(Python,Fortran,但自从我广泛使用C++以来已有数十年),但不是专业程序员。

我有一个由多个项目组成的解决方案,都在VS2008中。项目是: 阅读器(C++项目;利用第三方DLL) 查询(C++项目;取决于阅读器) 主要(VB;取决于Reader和Query)。

以下内容适用于XP64操作系统。 解决方案和项目是由我以外的人编写,构建和发布的。 我已经把现有的文件,并做了一份副本,放在我选择的目录,并在VS2010中简单地打开(VS2008未安装在我的电脑上)。我能够成功地建立(尽管有许多警告 - 稍后会有更多的警告);但是当我运行可执行文件时,它会到达一个点并崩溃。经过多次试验和错误,我发现编译器设置的修改为我解决了这个问题,如下所示:

它将在DEBUG配置中生成并执行,但没有发行版。我发现在Query项目的属性页/配置属性/ C++ /优化/优化 - > Release(x64)配置中使用'最大化速度(/ O2),而调试使用'Disabled(/ Od)' - >所以我切换到“禁用(/ Od)”。 此外,Query的项目属性页面/配置属性/常规/整体程序优化 - >需要设置为“使用链接时间码生成”。

上面的构建和在VS2010中XP64上成功运行。

接下来,我简单地复制了这些文件,并在VS7上放置了一个W7机器的副本。通过2010年打开解决方案,并自动“升级”文件。当我启动VS2010时,它会自动显示以下4条警告。它们是:

  1. 用于运算符'&'的对象类型的操作数;运行时错误可能发生。在文件'CobraIFile.vb'中,第1845行,第37列。
  2. 完全相同的错误
  3. 通过实例访问共享成员,常量成员,枚举成员或嵌套类型;符合条件的表达式将不会被评估。在文件'FileWriter.vb'中,行341,列51
  4. 用于操作符'='的Object类型的操作数;使用'Is'运算符来测试对象标识。在'FormMain.vb'文件中;在1 & 2 4173线,列32

代码警告是如下 ValueStr =的String.Empty 对于iCols = 0至DGrid.Columns.Count - 1 ValueStr & = DGrid.Item(iCols ,iRows)。价值&“;” //这是警告线!!! 接下来

代码警告3:

With FormMain 
     WriteComment("") 
     WriteComment("Generated by :") 
     WriteComment("") 
     WriteComment(" Program   : " & .PROGRAM.ToUpper) // THIS IS WARNING LINE!!! 

代码警告4:

' Compare material against the material table 
    For iRowMat As Integer = 0 To matCount - 1 
     ' Ignore new row 
     If Not .Rows(iRowMat).IsNewRow Then 
      ' Check material description 
      // LINE BELOW IS WARNING LINE!!! 
      If .Item("ColMatDesc", iRowMat).Value = matDesc Then 
       DataGridMatProp.Item("ColMatIdx", iRow).Value = .Item("ColMatFile", iRowMat).Value 
       Exit For 
      End If ' Check description 
     End If ' Check new row 
    Next iRowMat 

当我构建解决方案,它将成功建立一个没有错误(但许多警告),而当我运行可执行文件,它成功加载了GUI,但是在执行Query或Reader项目时(在使用gui按钮执行操作之后)出现以下信息时崩溃:

C:\Users\mcgrete\AppData\Local\Temp\WER5D31.tmp.WERInternalMetadata.xml 
    C:\Users\mcgrete\AppData\Local\Temp\WER68E6.tmp.appcompat.txt 
    C:\Users\mcgrete\AppData\Local\Temp\WER722A.tmp.mdmp 

我无法利用上述三个文件中的信息(不知道如何考虑这么做)。

我在W7中收到的警告与XP64中的警告非常相似/不相同;他们沿着以下类型的线,并且有超过1,600个。添加到上面列出的原始4个警告下面的警告类型。随着我在XP64上运行的成功,而不是在W7上,我假设/希望这些不需要单独解决,但只是警告。

  1. 警告C4267:'参数':从'size_t'转换为'int',可能会丢失数据。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ exec \ win64 \ 6111 \ include \ atr_StringBase.h 351读写器
  2. 警告C4018:'<':signed/unsigned mismatch C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ exec \ win64 \ 6111 \ include \ omi_BlkBitVectTrav.h 69读卡器
  3. 警告C4244:'初始化':从'double'转换为'float',可能会丢失数据。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ exec \ win64 \ 6111 \ include \ g3d_Vector.h 76读卡器
  4. 警告C4244:'initializing':从'double'转换为'float',可能数据丢失。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ exec \ win64 \ 6111 \ include \ g3d_Vector.h 76读者
  5. 警告C4800:'int':强制值为bool'true'或'false' (性能警告)。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ exec \ win64 \ 6111 \ include \ rgnC_Region.h 219读者
  6. 警告LNK4006:“public:class ddr_ShortcutImpl const & __cdecl cow_COW,struct cow_Virtual>>: :ConstGet(void)const“(?ConstGet @?$ cow_COW @ V?$ ddr_ShortcutImpl @ VkmaC_Material @@@@ U?$ cow_Virtual @ V?$ ddr_ShortcutImpl @ VkmaC_Material @@@@@@@@@@@ QEBAAEBV?$ ddr_ShortcutImpl @ VkmaC_Material已在ABQDDB_Odb_import.lib(ABQDDB_Odb.dll)中定义; @@@@ XZ)忽略第二个定义C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ source \ 312i3.3 \ Reader \ ABQSMAOdbCore_import.lib(ABQSMAOdbCore.dll)读取器
  7. 警告LNK4221:此对象文件未定义任何以前未定义公共符号,所以它不会被任何使用这个库的链接操作使用。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ source \ 312i3.3 \ Reader \ ABQSMAOdbCore_import.lib(ABQSMAOdbCore.dll)读取器
  8. 警告C4996:'sprintf':此函数或变量可能不安全。考虑使用sprintf_s代替。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。 C:\ Users \ mcgrete \ Documents \ iCOBRA \ pts \ p312 \ source \ 312i3.3 \ Query \ Query.cpp 271 1查询
  9. 警告MSB8004:输出目录不以结尾斜杠结尾。此构建实例将根据需要添加斜杠,以便正确评估输出目录。 C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ Microsoft.CppBuild。针对299 6查询

现在我请求帮助:

我必须澄清,我愿意深入警告上面详细;然而,我并没有像以前那样投入这项工作,也没有先写代码,我只是想了解什么可能是真正的根本原因,然后把重点放在这个方向上。

  1. 我很失望,我经历了XP64的问题,如果被要求必须配置的变化是不确定,或者如果我所做的更改只是实际上是一个“变通”到一个身份不明的问题呢?
  2. 我预计,一旦解决方案的XP64 VS2010版本可以运行,它将转移到W7而不会出现问题,因为该软件可以在VS2008和XP64上编译和运行。这是一个可怜的假设吗?我可能会错过什么?
  3. 我应该考虑尝试再次修改配置,还是可能与上述警告相关联的根本原因?如果警告,为什么它们在VS2008中显然不是问题 - VS2010中的更改是否有效地导致了实际运行时错误的产生?在VS2008中,我幸运地'幸免'了痛苦?

我很欣赏任何有关如何继续的指导和洞察,因为从我的有限经验来看,网上搜索显示有许多编译器bug或VS2010中的相关内容。不知道是否有任何与我的问题有关,如果许多警告实际上是一个问题,并且代码需要相当多的清理,或者只是有一些我可能需要处理的配置问题。

仅供参考 - 我安装的VS2010的最新更新/ SP是VS10SP1-KB2736182.exe。我也使用调试器,但无法在我的Query或Reader项目代码中的断点处停止,即使在以管理员身份运行VS2010时也是如此。 W7确实安装了.NET Framework 4.0多目标包,并将我的解决方案配置为使用.NET Framework 4.0客户端配置文件。

在此先感谢!

更新2013年3月18日 我不知道如何回复我自己的问题,所以这是一个更新。

我仍然无法设法让调试器工作;所以,我以旧式的方式做了它 - 添加了各种消息框来查找崩溃的位置。 答Main.vb程序中的“查询”项目

OdbQueryGetIncrement(str_out, vec_ptr) 

B.调用一个函数然后,通过功能100%执行,试图返回一个布尔值...这里是一些老式代码调试码加入...

//Gets the next item in a list. 
    // Returns false if there is the vector is empty. 
    // NOTE: Once an element is returned it is removed from the list. 
    bool __stdcall OdbQueryGetItem(
        char* &str_out, // RETURN Next item in list. 
      void * vec_ptr, // Pointer to the vector of pointers. 
      int index) // Index of pointers vector to return next item of. 
    { 
     // Cast the point into an array of pointers 
     std::vector<std::string>* *vec_temp = (std::vector<std::string>* *) vec_ptr; 
     bool bool_out = false; 

     char vectempsize[1000]; 
     int TEM1; 
     char temp[1000]; 
     TEM1 = vec_temp[index]->size(); 
     // Check vector is valid 
     if (vec_temp) { 
      if(vec_temp[index]->size() >= index) 
      { 
       sprintf(temp,"value: %d\n",(int)bool_out); 
       ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - bool_out", MB_ICONINFORMATION); 
       sprintf(temp,"value: %d\n",(int)index); 
       ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - index", MB_ICONINFORMATION); 
       sprintf(vectempsize,"value: %d\n",(int)TEM1); 
       ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - index", MB_ICONINFORMATION); 
      } 

      if (!vec_temp[index]->empty()) { 
       // Get the next item in the list 
       std::string item = vec_temp[index]->front(); 
       // Initialise ouput string 
       str_out = (char*)malloc(item.size()*sizeof(char)); 
       sprintf(str_out, "%s", item.c_str()); 

       ::MessageBoxA(0,(LPCSTR) str_out, (LPCSTR) "hello", 0); 
       // Remove first item from the vector 
       vec_temp[index]->erase(vec_temp[index]->begin()); 
       bool_out = true; 
      } 
     } 

     sprintf(temp,"value: %d\n",(int)bool_out); 
     ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - bool_out", MB_ICONINFORMATION); 
     return bool_out; 
    } 

的代码开始时与bool_out =假如预期(认证用的MessageBox值= 0输出) 代码读取并输出索引= 2与在MessageBox ... 该代码用MessageBox读取和输出TEM1 = vec_temp [index] - > size()作为值= 2 ... 该代码输出bool_out为真(值= 1)与MessageBox ... 然后,代码崩溃。紧接放在调用上述代码的行之后的MessageBox永远不会被执行。 VS2010的输出是“The program”[6892] ae312i3.3.exe:Managed(v4.0。30319)”已退出,代码为-2147483645(0x80000003)。”

我迷路了,为什么执行时会从这个函数返回死亡。 是否与编译器设置或错误的一些可能的问题?

!任何帮助表示赞赏

更多信息

你好,我修改了在属性页面的一些设置,以尝试获取调试器给我更多的信息,这导致了更多的信息,如下所示:

ae312i3.3.exe中的0x76e540f2(ntdll.dll)未处理的异常:0xC0000374:堆已损坏。

我不熟悉如何考虑修复堆问题;也许现有代码中的指针指向另一个线程或程序使用的内存,损坏了ntdll.dll文件,其他?

我会尝试重新启动PC,看看是否有帮助,虽然我对此没有多少希望......没有帮助。

在调试器中找到选项来'启用非托管代码调试',选中它;清洗;重建;与调试运行...

输出更具描述 -

HEAP [ae312i3.3.exe]:指定RtlSizeHeap(0000000000220000,000000002BC8BE58) 无效地址Windows已经引发了ae312i3.3断点。可执行程序。

这可能是由于堆损坏引起的,这表示ae312i3.3.exe或其中已加载的任何DLL的错误。这也可能是由于用户按下F12而ae312i3.3.exe具有焦点。

似乎崩溃时,C++返回一个布尔变量的形式

While (myQueryFcn(inputvars))

那么,是它不返回一个C++布尔到VB布尔表达式?我相信这两个是不同的表示(一个使用True/False,另一个是整数?)这可能是一个问题吗?如果是这样,为什么它不是VB2008中的问题?

+0

我会尝试尽可能温和地说这个,是人谁也写很长的职位,但这个问题过长。这可能就是为什么你没有得到太多的反馈,即使你几天前第一次问到它。 Visual Studio是我知道的很多产品,但我没有时间坐下来仔细阅读整个问题。我真的需要知道我能否帮助你解决问题吗?我强烈建议在问题的顶部附上“执行摘要”或“摘要”。将其余的放在那里,这样我们只有在需要的时候才能阅读它。 – 2013-03-18 22:03:57

回答

0

我解决了我自己的问题;问题的根源如下。

根本原因:

  1. 的VisualBasic(VB)称为C++。

  2. VB创建了一个字符串并发送给C++。以前的开发人员/编码人员在C++中为相同的字符串分配内存。

  3. 当C++代码执行结束时,C++似乎终止了由VB和C++建立的内存分配。

解决方案: 1.删除的存储器分配在C++代码(下文)。

str_out=(char*)malloc((item.size()+1)*sizeof(char)); 
  • 改性VB代码来使用StringBuilder类型,而不是字符串。

    昏暗str_out作为StringBuilder的=新的StringBuilder(5120)

  • 参见:return string from c++ function to VB .Net