VS2008 to VS2010 - Problematic Configuration and Upgrade - Newbie

0

I have updated this question with an executive summary at the start below. Then, extensive details follow, if needed. Thanks for the suggestions.

Exec Summary: I am a novice with VS. I have a problem with some inherited code. Code builds and executes fine on VS2008 (XP64). Same code will either build and not run, or fail to build on XP64 or W7 with VS2008 and/or VS2010. After changing some compiler options, I managed to get it to run without an issue on VS2010 on XP64; however, on W7, no luck.

I eventually discovered that the heap is getting corrupted.

Unhandled exception at 0x76e540f2 (ntdll.dll) in ae312i3.3.exe: 0xC0000374: A heap has been corrupted.

I am not familiar with how to consider fixing a heap problem; perhaps there is an issue with the pointers in the existing code that points to memory in use by another thread or program, corrupted ntdll.dll file, other?

Rebooting PC to check if ntdll.dll was corrupted didn't help. Changed debug settings, and received the following feedback:

HEAP[ae312i3.3.exe]: Invalid address specified to RtlSizeHeap( 0000000000220000, 000000002BC8BE58 ) Windows has triggered a breakpoint in ae312i3.3.exe.

This may be due to a corruption of the heap, which indicates a bug in ae312i3.3.exe or any of the DLLs it has loaded. This may also be due to the user pressing F12 while ae312i3.3.exe has focus.

It appears that when it crashes, C++ is returning a boolean variable to an expression of the form

While (myQueryFcn(inputvars))

  • QUESTIONS:

So, is it not returning a C++ boolean to a VB boolean? I do believe that the two are different representations (one uses True/False, the other an integer?) Could this be an issue? If so, why was it NOT an issue in VB2008?**

Or, perhaps it is that the C++ code has written to allocated memory, and upon returning to VB, it crashes???

** I have recently learned of 'Insure++', and will be trying to use it to track down the issue. Any suggestions on its use, other possible insight? **

I would appreciate any suggestions. Thanks again.

. . . . .

DETAILS THAT LED TO THE ABOVE SUMMARY (below):

I am a novice with VS2010; familiar with programming at an engineering application level (Python, Fortran, but been decades since I used C++ extensively), but not a professional programmer.

I have a solution that consists of multiple projects, all in VS2008. Projects are: Reader (C++ project; utilizes 3rd party DLLs) Query (C++ project; depends upon Reader) Main (VB; depends upon Reader and Query).

The following applies to XP64 OS. The solution and projects were written, built, and released by someone other than myself. I have taken the existing files, and made a copy, placed in a directory of my choice, and simply opened in VS2010 (VS2008 is not installed on my PC). I was able to successfully build (with many warnings though - more on that later) ; but when I ran the executable, it would reach a point and crash. After much trial and error, I discovered that modification of compiler settings resolved the issue for me as follows:

It would build and execute in DEBUG configuration, but no the Release. I found that the in the Query project Property Page / Configuration Properties / C++ / Optimization / Optimization --> the Release (x64) configuration utilized 'Maximize Speed (/O2) while the Debug used 'Disabled (/Od)' --> so I switched to 'Disabled (/Od). Also, Query's project Property Page / Configuration Properties / General / Whole Program Optimization --> needed to be set to 'Use Link Time Code Generation'.

The above build and ran successfully on XP64 in VS2010.

Next, I simply copied the files and placed a copy on a W7 machine with VS2010. Opened the solution via 2010, and it 'upgraded' the files automatically. When I launch VS2010, it automatically indicates the 4 following warnings. They are:

  1. Operands of type Object used for operator '&'; runtime errors could occur. In file 'CobraIFile.vb', Line 1845, Column 37.
  2. identical error completely
  3. Accesss of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. In file 'FileWriter.vb', Lines 341, Columns 51
  4. Operands of type Object used for operator '='; use the 'Is' operator to test object identity. In file 'FormMain.vb'; Line 4173, Column 32.

Code for warnings in 1 & 2 are as follows ValueStr = String.Empty For iCols = 0 To DGrid.Columns.Count - 1 ValueStr &= DGrid.Item(iCols, iRows).Value & ";" // THIS IS WARNING LINE!!! Next

Code for warning 3:

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

Code for warning 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

When I build the solution, it will successfully build without errors (but many warnings), and when I run the executable, it successfully loads the GUI, but at some point crashes while executing either the Query or Reader projects (after taking actions with gui buttons) with the following information:

    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

I was unable to utilize the information in the three files above (ignorant of how to consider to do so).

The warnings I receive in W7 are very similar / if not identical to that in XP64; they are along the lines of the following types, and there are over 1,600 of them. Add to the warning types below the original 4 warnings listed ealier above. With my success in running on XP64, and not in W7, I was assuming/hoping that these would not require to individually be addressed, but are only warnings.

  1. Warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data. C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\atr_StringBase.h 351 1 Reader
  2. Warning C4018: '<' : signed/unsigned mismatch C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\omi_BlkBitVectTrav.h 69 1 Reader
  3. Warning C4244: 'initializing' : conversion from 'double' to 'float', possible loss of data. C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\g3d_Vector.h 76 1 Reader
  4. Warning C4244: 'initializing' : conversion from 'double' to 'float', possible loss of data. C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\g3d_Vector.h 76 1 Reader
  5. Warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning). C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\rgnC_Region.h 219 1 Reader
  6. Warning 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@@@@XZ) already defined in ABQDDB_Odb_import.lib(ABQDDB_Odb.dll); second definition ignored C:\Users\mcgrete\Documents\iCOBRA\pts\p312\source\312i3.3\Reader\ABQSMAOdbCore_import.lib(ABQSMAOdbCore.dll) Reader
  7. Warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library. C:\Users\mcgrete\Documents\iCOBRA\pts\p312\source\312i3.3\Reader\ABQSMAOdbCore_import.lib(ABQSMAOdbCore.dll) Reader
  8. Warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Users\mcgrete\Documents\iCOBRA\pts\p312\source\312i3.3\Query\Query.cpp 271 1 Query
  9. Warning MSB8004: Output Directory does not end with a trailing slash. This build instance will add the slash as it is required to allow proper evaluation of the Output Directory. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets 299 6 Query

Now to my request for help:

I must clarify, I am willing to dig into the warnings above in detail; however, I have not done so as before investing that effort and not having written code to begin with, I am simply trying to understand what might be the true root cause, then focus efforts in that direction.

  1. I was disappointed with the XP64 issues I experienced, and was unsure if the changes required to the configuration were required, or if the changes that I made were only actually a 'work-around' to an unidentified problem?
  2. I expected that once the XP64 VS2010 version of the solution was operable, that it would transfer to W7 without an issue, as the software build and ran fine with VS2008 and XP64. Is that a poor assumption? What might I be missing?
  3. Should I consider attempting to modify the configurations again, or is the root cause likely associatd with the warnings indicated above? If the warnings, why were they apparently non-issues in VS2008 - did changes in VS2010 effectively lead to generation of actual runtime errors where in VS2008 I was luckily 'spared' the pain?

I appreciate any guidance and insight on how to proceed, as from my limited experience, it appears from searches on the web that there were numerous compiler bugs or related in VS2010. Not sure if any are related to my issues, if the numerous warnings are actually a problem and the code needs quite a bit of cleaning up, or if there are simply some configuration issues that I may have to deal with.

FYI - The latest update/SP to VS2010 that I have installed is VS10SP1-KB2736182.exe. I have also trid to use the debugger, but was unable to get it to stop at breakpoints in my Query or Reader project codes, even while running VS2010 as administrator. W7 does have .NET Framework 4.0 Multi-Targeting Pack installed, and my solution is configured to use .NET Framework 4.0 Client Profile.

Thanks in advance!

UPDATE March 18, 2013 I didn't know how to reply to my own question, so here is an update.

I still could not manage to get the debugger working; so, I did it the old fashioned way - added various MessageBoxs to find where it was crashing. A. The Main.vb program calls a function in the 'Query' project

OdbQueryGetIncrement(str_out, vec_ptr)

B. Then, the function executes through 100%, attempting to return a boolean...here is code with some old fashioned debugging code added...

    //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;
    }

The code starts out with bool_out=false as expected (verified with MessageBox value=0 output) The code reads and outputs index = 2 with the MessageBox... The code reads and outputs TEM1=vec_temp[index]->size() as a value=2 with the MessageBox... The code outputs bool_out as true (value=1) with the MessageBox... Then, the code crashes. A MessageBox that was placed immediately after the line that calls the code above never is executed. The output from VS2010 is "The program '[6892] ae312i3.3.exe: Managed (v4.0.30319)' has exited with code -2147483645 (0x80000003)."

I am lost as to why the execution would die while returning from this function. Is there some possible issue with compiler settings or bugs?

Any help is appreciated!

MORE INFORMATION

Hello, I modified some settings on the Properties Page to attempt to get the debugger to give me more information. This has resulted in more information as follows:

Unhandled exception at 0x76e540f2 (ntdll.dll) in ae312i3.3.exe: 0xC0000374: A heap has been corrupted.

I am not familiar with how to consider fixing a heap problem; perhaps there is an issue with the pointers in the existing code that points to memory in use by another thread or program, corrupted ntdll.dll file, other?

I will try rebooting PC to see if that helps, though I have little hope for that...didn't help.

Found option in Debugger to 'Enable unmanaged code debugging', checked it; cleaned; rebuild; run with debug...

Output more descriptive --

HEAP[ae312i3.3.exe]: Invalid address specified to RtlSizeHeap( 0000000000220000, 000000002BC8BE58 ) Windows has triggered a breakpoint in ae312i3.3.exe.

This may be due to a corruption of the heap, which indicates a bug in ae312i3.3.exe or any of the DLLs it has loaded. This may also be due to the user pressing F12 while ae312i3.3.exe has focus.

It appears that when it crashes, C++ is returning a boolean variable to an expression of the form

While (myQueryFcn(inputvars))

So, is it not returning a C++ boolean to a VB boolean? I do believe that the two are different representations (one uses True/False, the other an integer?) Could this be an issue? If so, why was it NOT an issue in VB2008?

visual-studio-2010
debugging
upgrade
asked on Stack Overflow Mar 15, 2013 by user2175064 • edited Jan 27, 2015 by NoviceCodingGeek

1 Answer

0

I solved my own problem; the root cause of the problem was as follows.

Root Cause:

  1. VisualBasic (VB) called C++.

  2. VB created a string and sent to C++. Previous developer/coder allocated memory in C++ for the same string.

  3. When execution of C++ code ended, C++ appears to have terminated the memory allocation established by VB and C++.

Solution: 1. Removed memory allocation in C++ code (below).

str_out=(char*)malloc( (item.size()+1)*sizeof(char) );
  1. Modified VB code to use a StringBuilder type, rather than string.

    Dim str_out As StringBuilder = New StringBuilder(5120)

See: return string from c++ function to VB .Net

answered on Stack Overflow Apr 22, 2013 by user2175064 • edited May 23, 2017 by Community

User contributions licensed under CC BY-SA 3.0