Those ?? are usually where the name of the function is displayed. GDB does not know the name of those functions and therefore displays ??.
Now, why is this happening? Depends. GCC compiles including symbols (e.g. function names and similar) by default. Most probably you are working with a stripped version, where symbols have been removed, or just with the wrong file.
As @zwol suggests, the line you see warning: exec file is newer than core file is an indication of the fact that something else is going on that you don't show in your question. You are working on a core dump file generated by the crashed executable, which is outdated.
I would suggest you to re-compile the program from scratch and make sure that you are opening the right file with GDB. First produce a new core dump by crashing the new program, then open it in GDB.
Assuming the following program.c:
int main(void) { return 1/0; }
This should work:
$ rm -f core $ gcc program.c -o program $ ./program Floating point exception (core dumped) $ gdb program core Reading symbols from program...(no debugging symbols found)...done. [New LWP 11896] Core was generated by `./program'. Program terminated with signal SIGFPE, Arithmetic exception. #0 0x000055d24a4cd790 in main () (gdb) bt #0 0x000055d24a4cd790 in main () (gdb)
NOTE: if you don't see (core dumped) when running the process that means that a core dump was not generated (which leaves you with the old one). If you are using Bash, try running the command ulimit -c unlimited before crashing the program.
-gor the program was not linked with-g. Sometimes, it means that you are looking at code provided by someone else in a library.-gboth for each object file and also when linking the program. Both!warning: exec file is newer than core fileindicates that the executable and the core dump don't match up, which might also explain gdb's failure.