Как мне вызвать функцию (void) в gdb

#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 ? давай … вы говорите компоновщику удалить неиспользуемые разделы во время отладки неиспользуемой функции? … не ищите волосы в яйце.