#c #c #gdb #void #function-call
#c #c #gdb #void #вызов функции
Вопрос:
Я полный новичок в reverse engg. В последнее время я просматривал gdb и способы отладки программ.
У меня есть большие сомнения в том, что это простой
#include <stdio.h>
#include <stdlib.h>
int flag(void){
puts("okay you got this");
}
int main(void){
puts("nope try again");
}
Итак, я успешно скомпилировал эту программу, когда я пытаюсь запустить эту программу, она выдает мне вывод основной функции
nope try again
итак, теперь, как мне вызвать функцию флага, чтобы выдать вывод «хорошо, вы получили это» в gdb Я старался изо всех сил и просматривал блоги, чтобы получить ответ, но я потерпел неудачу Надеюсь, я получу решение и любезно предложу мне, чего мне не хватает и что мне нужно знать о том, какработает ли это
Ответ №1:
Вы имеете в виду, как вызвать flag()
и пропустить puts
in main
?, в данном случае:
(gdb) break main
(gdb) run
(gdb) print flag()
okay you got this
(gdb) break 10
(gdb) jump 10
(gdb) quit
Комментарии:
1. Нет, это тоже не дает мне выхода, если я дам
p flag()
gdb возвращает этоflag has no return type; cast the call to its declared return type
, и если я дамp flag(void)
gdb возвращает$1= {<text variable, no debug info>} [addrss] <flag>
, поэтому я не могу вызвать, который помещает2. флаг не имеет возвращаемого типа : это gcc (предупреждение), который сообщает вам, что (не gdb) используется
void flag(void)
для исправления предупреждения, а «нет отладочной информации» означает, что вы не компилируете-g
, то есть символы удаляются (и, следовательно, они не вызываются), компилируются с помощью:gcc -g -o program program.c
3. да, понял, спасибо за помощь!!! он вернул вывод функции флага..
Ответ №2:
Функция flag
не вызывается, и очень вероятно, что она не будет присутствовать в исполняемом файле, поскольку не нужна
Это называется устранением мертвого кода
Комментарии:
1. Nops, OP отлаживается и наверняка использует
-g
флаг без оптимизации,flag()
в таком случае нет удаления мертвого кода.2. @DavidRanieri
-g
не гарантирует устранения мертвого кода, важнее то, что есть (если мы рассмотрим gcc в файле спецификаций по умолчанию). Я использую -g и удаляю мертвый код.3. Я использую -g и удаляю мертвый код. в этом случае? Я так не думаю… какую версию gcc вы используете?
4. Только статические функции могут быть мертвым кодом. Функции с внешней связью могут вызываться другими единицами перевода, включая те, которые загружаются динамически.
5.
--gc-sections
? давай … вы говорите компоновщику удалить неиспользуемые разделы во время отладки неиспользуемой функции? … не ищите волосы в яйце.