In Windows it is still possible to get the full call stack for applications without symbol information, provided 'stack frame pointers' are put on the call stack. These stack frame pointers are generated by the Visual Studio compiler if you compile with debug, but not if you compile with optimization (/Ox). Therefore, if you still want the stack frame pointers with optimization, you have to add the /Oy- compiler option (Oy- stands for: don't remove the stack frame pointers).
The stack frame pointers do nothing more than just point to the next stack frame. Therefore, debuggers and crash-handlers can easily get the stack (by looking at the stack frame pointers to follow the stack, and using the return addresses on the stack).
If the application has no stack frame pointers, the debugger or crash-handler has to use the debug information to know the number of function arguments, the number of local variables, ... in order to get the size of each stack frame and to follow all the stack frames on the call stack.