I don’t think I’ve ever come across anything written by John Robbins that is not worth reading. But in a recent post he talks about a subject that rings particularly true for me – the importance of debug symbols. Symbols are like the Rosetta stone of debugging – they are the key to interpreting debugger output and relating it back to the source code of the application or component. Without it, much of the debugger output is meaningless. Not meaningfree. Just meaningless. It is not impossible to debug without symbols. It is just much harder. Maybe 10 times harder, maybe 100 times harder. And harder means more time and more time means more money.
I have lost count of the number of situations where I have assisted customers with application in production that are dying on their feet due to some crash or memory leak and the conversation goes something like this:
Me: You application is failing/leaking memory from modulename!RandomSoundingFunctionName+0xVERYBIGHEXOFFSET
Customer: My development team doesn’t recognise that function
Me: That’s because it is simply the nearest exported function name that the debugger has found, plus an offset
Customer: Can we get the actual function name?
Me: Unfortunately not without matching symbols
Customer: My development team have just rebuilt the component with symbols and I’ve uploaded the PDB to you
Me: I can’t use that because it doesn’t match the binary that was on the server when the dump file was generated
Customer: My development team says they haven’t changed the source code much since the original deployment
Me: Unfortunately it won’t work. Even with no code changes a PDB can change from one compilation to the next, depending on the compiler. They will need to recompile and then you will have to redeploy, reproduce the issue, gather more dump files and upload them
Customer: That will take a week of dev, a week of test and a week of change control approval
Me: Ok, well, let’s see what we can do in the meantime
So my recommendation is – read John’s post and heed his wisdom.