GDB пропускает строки кода с++

191
31 мая 2018, 23:00

Вот программа:

#include <iostream>
int main()
{
    try
    {
        throw std::out_of_range("Huston, we have a problem");
    }
    catch(std::out_of_range obj)
    {
    }
    std::cout << "Hello world" << std::endl;
return 0;
}

Компилирую ее с помощью команды:

g++ -g -O0 main.cpp

Запускаю в gdb и пытаюсь отладить:

(gdb) break main
Breakpoint 1 at 0x100000d42: file main.cpp, line 7.
(gdb) run
Starting program: /Users/admin/repositories/oop_workspace/a.out 
[New Thread 0x1c03 of process 5743]
warning: unhandled dyld version (15)
Thread 2 hit Breakpoint 1, main () at main.cpp:7
7           throw std::out_of_range("Huston, we have a problem");
(gdb) next
Hello world
[Inferior 1 (process 5743) exited normally]
(gdb) 
The program is not being run.

Код ниже try-catch блока не отлаживается, а вместо этого просто выполняется. В чем может быть проблема?

Answer 1

Где-то в сети я видел сообщение, что в Linux проблема (останов по stepping после С++ exception) решена, но не нашлось никого, кто перенес бы этот fix в MinGW :).

Однако, оказалось что в моей Linux avp-ubu1 4.4.0-127-generic #153-Ubuntu SMP Sat May 19 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux, также как у вас, не работает.

Остается воспользоваться советом из Debugging with GDB и ввести команду catch catch перед запуском.

Вот результат:

avp@avp-ubu1:hashcode$ g++ t.cpp -g
avp@avp-ubu1:hashcode$ gdb ./a.out
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
(gdb) catch catch
Catchpoint 1 (catch)
(gdb) r
Starting program: /home/avp/hashcode/a.out 
Catchpoint 1 (exception caught), 0x00007ffff7ae1711 in __cxa_begin_catch ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) n
Single stepping until exit from function __cxa_begin_catch,
which has no line number information.
main () at t.cpp:14
14      std::cout << "Hello world" << std::endl;
(gdb) 
Hello world
16  return 0;
(gdb) 
17  }
(gdb) c
Continuing.
[Inferior 1 (process 11769) exited normally]
(gdb) q
avp@avp-ubu1:hashcode$ 

Как видите, все получилось. Если остановиться в начале (br main) и идти построчно (next), то тоже все нормально работает.

P.S.
Для останова в точке генерации exception введите команду catch throw.

READ ALSO
Стили для дочерних элементов

Стили для дочерних элементов

Допустим у нас есть два div-а

214
Почему hover эффект не работает на ширине меньше 1200 пикселей?

Почему hover эффект не работает на ширине меньше 1200 пикселей?

Есть не большой hover эффект (Называется эффект Роршаха)

204
Не получается использовать import&#39;ы из es6 в node.js

Не получается использовать import'ы из es6 в node.js

Не получается подключить модули с помощью import

195