【问题标题】:How do I call function(void) in gdb如何在 gdb 中调用函数(void)
【发布时间】:2020-09-19 06:11:40
【问题描述】:

我是反向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 中给出“好的,你得到这个”输出 我尽我所能,浏览博客以获得答案,但我最终失败了希望生病得到解决方案,请告诉我我缺少什么以及我需要知道它是如何工作的

【问题讨论】:

    标签: c++ c gdb void function-call


    【解决方案1】:

    您的意思是如何调用flag() 并跳过main 中的puts?,在这种情况下:

    (gdb) break main
    (gdb) run
    (gdb) print flag()
    okay you got this
    (gdb) break 10
    (gdb) jump 10
    (gdb) quit
    

    【讨论】:

    • 不,它也不会让我出局,如果我给p flag() ,gdb 会返回这个flag has no return type; cast the call to its declared return type,如果我给p flag(void),gdb 会返回$1= {&lt;text variable, no debug info&gt;} [addrss] &lt;flag&gt;,所以我无法调用它放
    • flag has no return type:是 gcc(警告)告诉你(不是 gdb)使用 void flag(void) 修复警告,并且“没有调试信息" 表示您没有使用 -g 进行编译,也就是说,符号被删除(因此它们不可调用),编译使用:gcc -g -o program program.c
    • 是的,明白了,感谢您的帮助!它返回了标志函数输出..
    【解决方案2】:

    函数flag没有被调用,它很可能不会出现在不需要的可执行文件中

    这叫死码消除

    【讨论】:

    • Nops,OP 正在调试,并且肯定使用 -g 标志而不进行优化,在这种情况下,flag() 不会消除死代码。
    • @DavidRanieri -g 不保证没有死代码消除,更重要的是(如果我们考虑默认规范文件中的 gcc)。我使用 -g 并消除了死代码。
    • 我使用 -g 并消除了死代码。 在这种情况下?我不这么认为...您使用的是哪个版本的 gcc?
    • 只有静态函数可以是死代码。具有外部链接的函数可能会被其他翻译单元调用,包括那些动态加载的。
    • --gc-sections?来吧...您告诉链接器在调试未使用的功能时删除未使用的部分? ...不要在鸡蛋里寻找头发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多