У меня есть следующий код С++:
основной.cpp:
#include "a.h"
int main(){
int x[3];
some_macro(x)
// comment
// comment
return x[2];
}
ааа:
template <typename T>
inline void some_macro_break_point()
{
}
#define some_macro(name) \
{ \
some_macro_break_point(); \
}
и используя расширение Python GDB, я пытаюсь получить строку и файл, в которых был вызван макрос при использовании GDB, учитывая тот факт, что у меня есть автоматическая точка останова над some_macro_break_point
При достижении точки останова я делаю следующее:
frame = gdb.newest_frame()
frame = frame.older()
pc = frame.pc()
symtab_line = gdb.find_pc_line(pc)
print(">>>> ", symtab_line.symtab.fullname() + ":" + str(symtab_line.line), "<<<<\n")
В случае, если у меня есть комментарии под вызовом макроса в основном файле, я получу строку + <number_of_comments_under_it>
Как я могу определить точную строку, в которой макрос был вызван правильно? Когда у меня нет комментариев, я получаю строку со смещением 1.
Я пытался получить символическую таблицу кадра GDB, но на значения повлиял тот факт, что под вызовом макроса были комментарии.
Попробуйте вычесть 1
из ПК, например pc = frame.pc() - 1
.
@ssbssa, я только что обновил, это была ошибка
вычитание 1 из ПК сработало! но какая здесь логика?
Неясно. Опубликуйте минимально воспроизводимый пример .
ssbssa> Попробуйте вычесть 1 из ПК, например pc =frame.pc() - 1. Руба Рашраш> вычитание 1 от пк сработало! но какая здесь логика?
Логика такова: когда срабатывает ваша точка останова, кадр в стеке равен some_macro_break_point
, а frame.older().pc()
указывает на место в main
, куда some_macro_break_point()
вернется.
Это место находится после места, из которого main
был вызван some_macro_break_point()
, а именно, это следующая исполняемая строка.
Все это станет понятнее, если вы disas/s main
и распечатаете frame.older().pc()
.
some_macro_break_point
звонит себе? В любом случае код вa.h
не компилируется.