The best you can do if you only have MAP-files is to study the EXE-file in a disassembler and compare to constructs that you recognize from the common ways the compiler generates code. These you have to learn. That means learning at least some assembler is required. This is good knowledge that will help you in the future, especially if you have to debug a lot of code.
A slightly simpler approach is to download the free Intel-books on processor instructions and simply check out their sizes. This way you can count your way to the faulting instruction. For best results the two methods should be used in conjunction with each other.
Typically what you'd be looking for is something that looks a bit like this:
mov DWORD PTR [edi+40], eax
(Instruction, register, offset, size and order can be different but indirection is typically where most code crashes)
Whatever you do you should seriously consider turning on COD-file generation for the future as that makes it super-easy to find the faulting line.