Можно ли проверить возвращаемое значение функции в GDB, предполагая, что возвращаемое значение не присвоено переменной?
103
Можно ли проверить возвращаемое значение функции в GDB, предполагая, что возвращаемое значение не присвоено переменной?
Я полагаю, что есть более эффективные способы сделать это, но команда завершения выполняется до тех пор, пока текущий кадр стека не выскочит и не распечатает возвращаемое значение - учитывая программу
int fun() {
return 42;
}
int main( int argc, char *v[] ) {
fun();
return 0;
}
Вы можете отладить его как таковой -
(gdb) r
Starting program: /usr/home/hark/a.out
Breakpoint 1, fun () at test.c:2
2 return 42;
(gdb) finish
Run till exit from #0 fun () at test.c:2
main () at test.c:7
7 return 0;
Value returned is $1 = 42
(gdb)
Команда finish
может быть сокращена как fin
. НЕ используйте f
аббревиатуру frame
команды!
Да, просто проверьте
EAX
реестр, набравprint $eax
. Для большинства функций возвращаемое значение сохраняется в этом регистре, даже если оно не используется.Исключением являются функции, возвращающие типы размером более 32 бит, в частности 64-битные целые числа (
long long
),double
s иstructs
илиclasses
.Другое исключение - если вы не используете архитектуру Intel. В этом случае вам нужно будет выяснить, какой регистр используется, если таковой имеется.
источник
Вот как это сделать без символов.
Форматирование там немного запуталось, обратите внимание на использование «информационного фрейма» для проверки фреймов и «фрейма №» для перехода вашего контекста в другой контекст (вверх и вниз по стеку)
bt также показывает сокращенный стек, чтобы помочь.
источник