Failure to get call stack in a debug build C++

1

I have a weird situation. My game is definitely being built with debugging information, and I can merrily hit breakpoints and step through code, and look at data. No settings are unusual. I have ruled out multithreading as a problem. When I have an actual bug, and a legitimate crash, i get no call stack. A typical crash bug will be

First-chance exception at 0x004678da in Democracy3Debug.exe: 0xC0000005: Access violation reading location 0x0000004c.
Unhandled exception at 0x774015de in Democracy3Debug.exe: 0xC0000005: Access violation reading location 0x0000004c.

And the callstack is just ntdll and some disassembly. I must have changed some option somewhere, but cannot imagine what. Any ideas?

c++
debugging
asked on Stack Overflow Feb 25, 2013 by cliffski

2 Answers

1

Those errors are indicative of hardware exceptions due to an attempt on your part to access memory that your process cannot read or write. In particular, it looks like you are directly or indirectly attempting to access some element 76 bytes from the address referred to by some pointer, but that pointer is in fact null (thus the access violation reading location 0x0000004c).

Your debug information may not be invalid in any way, you simply may legitimately be in some code inside nt.dll -- for example, if you passed a null pointer to a Windows API function that does not permit them. If you don't have symbols loaded for nt.dll, you won't get a useful call stack.

It's also possible the access violation's coming from a bad pointer you passed that wasn't used until some callback was invoked by the Windows API, which might explain why you don't see your code anywhere in the stack frame.

Enabling break-on-throw in the VS IDE (Debug -> Exceptions, check the boxes for relevant exception types) can help you break earlier when this occurs, but may not help diagnosing the problem if it's legitimately not directly from your code.

You can also use structured exception handling to integrate these exceptions and C++'s exceptions for catching purposes. You may also want to look in to using a symbol server to get the symbols for the Windows DLLs.

answered on Stack Overflow Feb 25, 2013 by (unknown user)
0

Your exception isn't being caught, so it's moving up the call stack all the way to main and terminating your app.

MSDN:

If a matching handler (or ellipsis catch handler) cannot be found for the current exception, the predefined terminate run-time function is called.

There's usually an option to allow you to pause debugging when an exception is thrown.

How to: Break When an Exception is Thrown (Visual Studio 2012)

You could also have a catch statement at top level and examine the exception (.what() often gives an description) when you catch it.

Update: You most likely can't catch this exception because it's an Access violation (not a C++ exception, but the pause should still work afaik). If you're on Windows you could use SEH to catch it.

answered on Stack Overflow Feb 25, 2013 by CiscoIPPhone

User contributions licensed under CC BY-SA 3.0