Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#cpp #отладка #gdb


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

#include 

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 блока не отлаживается, а вместо этого просто выполняется.
В чем может быть проблема?
    


Ответы

Ответ 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 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: . Find the GDB manual and other documentation resources online at: . 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.

Комментариев нет:

Отправить комментарий