Я использую функции C++ 11 activelly. У меня есть программа, созданная в Visual Studio 2013, которая полагается на lambdas для запуска нескольких потоков (лямбда представляет задачу, а поток получает экземпляр лямбды, который он должен выполнить). Lambda определен в статической библиотеке и связан в исполняемом файле, который вызывает его из потока, созданного этим исполняемым файлом. Когда я пытаюсь отлаживать версию Linux этого приложения с помощью GDB, похоже, что GDB не может войти в метод, содержащий лямбда. Он не может установить точки останова в этой функции, и когда я пытаюсь вмешаться, он даже делает шаги в методах, которые лямбда вызовы из его тела, но после return
из этих методов он не переходит в тело лямбды, он переходит к следующему методу, который лямбда-звонки и т. д. Есть ли способ отладить тело lambdas с помощью GDB?Может ли GDB отлаживать лямбда?
15
A
ответ
4
Я видел их в следах стека раньше, поэтому он, по крайней мере, знает о них. Я никогда не пытался установить нормальную точку останова в одном. Это своего рода хак, но вы можете установить точку останова в одном (или в любом месте), используя asm volatile("int $3");
на x86 (-64).
Вот пример программа:
int main(){
auto f = [](){
asm volatile("int $3");
};
f();
return 0;
}
Вот это трассировка, когда она попадет точку останова:
#0 0x0000000000400577 in main::{lambda()#1}::operator()() const()
#1 0x000000000040058d in main()
1
Из моего опыта, GDB не может уйти в лямбды - он просто пропускает их. Не только это, вхождение в определение лямбда, похоже, путает gdb, и оно переходит к концу текущей функции. Тем не менее, вы можете разместить точку останова внутри лямбда, и если вы ударите эту точку, вы остановитесь. Это явно далеко от идеала.
Смежные вопросы
- 1. Может ли gdb отлаживать корневые программы suid?
- 2. Может ли 32-битный gdb отлаживать 64-битный двоичный файл?
- 3. GDB, как отлаживать макрос
- 4. Как отлаживать использование gdb?
- 5. gdb: Как отлаживать общую библиотеку
- 6. Eclipse CDT не может отлаживать использование gdb на Mac
- 7. Можно ли отлаживать другие приложения iOS с помощью gdb/lldb?
- 8. GDB поврежденный стек кадров - как отлаживать?
- 9. Как отлаживать адреса, указанные в backtrace gdb
- 10. gdb разбивает мою машину. Как отлаживать?
- 11. Как отлаживать неудачный тест груза в gdb?
- 12. Как мне отлаживать Samba с GDB
- 13. Как отлаживать проблемы с Android/GDB/Qt?
- 14. Как отлаживать gstreamer с помощью gdb?
- 15. Как отлаживать jonesforth с помощью GDB?
- 16. cortex-m3 не может отлаживать. причина - SIGINT
- 17. Как отлаживать выражение лямбда с помощью jdb
- 18. Может ли gdb распечатать 64-битный адрес?
- 19. Может ли моя программа взаимодействовать с GDB?
- 20. Может ли незахваченная переменная затеняться параметром лямбда?
- 21. Может ли лямбда иметь связь «С»?
- 22. Может ли функция лямбда вернуть тип указателя?
- 23. Может ли общий лямбда не иметь аргументов?
- 24. Может ли C++ лямбда-выражение бросить?
- 25. Qt Creator не может отлаживать Ubuntu 10,04
- 26. Как отлаживать Java -JNI с помощью GDB на Linux?
- 27. gdb не может открыть файл общего объекта
- 28. Можно ли отлаживать gcc-скомпилированную программу с помощью lldb или отлаживать скомпилированную с помощью глагола программу с помощью gdb?
- 29. Как отлаживать общую библиотеку с использованием eclipse/gdb в Windows?
- 30. Как отлаживать ошибку «Abort trap: 6» с gdb
Что вы подразумеваете под «методом», здесь? Этот термин не определен в C++. –
Я имею в виду функцию нестатического объекта-члена, когда говорят 'метод'. – Vitaliy
Спасибо за разъяснение. –