【问题标题】:C programming gdb error messageC 编程 gdb 错误信息
【发布时间】:2014-09-01 19:28:08
【问题描述】:

我是使用 gdb 的新手,所以我想从使用一个打印“Hello”的简单程序开始

#include<stdio.h>
main(){
printf("Hello!\n");
}

另存为 hello.c,然后输入 gdb。根据教程打开后,我键入“file hello.c”以将程序加载到调试器中,但我收到以下消息:

This GDB was configured as "x86_64-linux-gnu".
"hello.c": not in executable format: File format not recognized

所以我输入了“gcc -Wall -g hello.c -o hello”并得到了这条消息:

hello.c:3:1: warning: return type defaults to âintâ [-Wreturn-type] hello.c: 
In function âmainâ: hello.c:6:1: warning: control reaches end of non-void function [-Wreturn-type]

然后我用 int main 编辑了 main 并在代码中添加了 return 0。我又做了一次,没有错误,所以我输入了 gdb ./hello 并且它起作用了...我应该始终将我的 mains 作为 int main 并包含 return 0 吗?

【问题讨论】:

  • 您调试已编译的可执行文件,而不是源代码。
  • 您的程序不正确。将 main 声明为 int main() 或最好是 int main (int argc, char**argv)
  • 不要忘记右大括号}之前的return 0;

标签: c gdb


【解决方案1】:

安装打包的(适用于您的系统)gdb 调试器和gcc 编译器。在 Debian 和相关(例如 Ubuntu)发行版上,以 root 身份运行(例如使用sudo):

 apt-get install gcc gdb build-essential

在 Linux 上,您需要(或想要)编译您的 hello.c 以及所有警告和调试信息,即使用

 gcc -Wall -g hello.c -o hello

此时您可能会收到来自gcc 的一些错误或警告消息;尝试更正您的源文件hello.c 并再次重复编译。

你应该决定使用C99标准,然后在gcc之后和-Wall之前添加-std=c99

检查

 ls -ls hello.c hello

您的hello 可执行文件已生成(并且比源hello.c 文件更年轻)。

然后你启动调试器(通过提供可调试的可执行文件)

 gdb ./hello

然后您会收到(gdb) 提示。尝试在main 中使用

 break main

GDB 命令。然后,用run 运行你的程序,它应该到达main 处的断点;此时,输入help 以获取有关 GDB 命令的帮助。

大多数 GDB 命令可以用它们的前几个字母缩写。所以你可以输入b 而不是break

您绝对应该了解watch gdb 命令,它在实践中非常有用。


关于main,您应该将其定义为int main (int argc, char**argv),并以return 0;(或其他一些小的正整数,用于运行时错误情况)结束。实际上,您应该将#include &lt;stdlib.h&gt; 添加为包含的标题(就像您为&lt;stdio.h&gt; 所做的那样)并使用return EXIT_SUCCESS;。另请阅读exit(3);一般来说,请阅读您正在使用的每个函数的文档(例如printf(3)),并接受您可能首先不了解所有文档。您可能需要安装manpages-dev 软件包并了解man 命令。

【讨论】:

  • 我输入了“gcc -Wall -g hello.c -o hello”并收到了这条消息:hello.c:3:1: warning: return type defaults to âintâ [-Wreturn-type ] hello.c:在函数âmainâ:hello.c:6:1:警告:控制到达非空函数[-Wreturn-type]的末尾,所以我用int main编辑了main并在代码中添加了return 0。我又做了一次,没有错误,所以我输入了 gdb ./hello 并且它工作了......
  • 请编辑您的问题以通过告诉消息来改进它(在您的问题中,而不是在 cmets 中)
  • 所以编译器应该会警告你。你的hello.c 程序是错误的。但是使用ls -ls hello 检查最近是否生成了hello 可执行文件。
  • Int argc, char** argv 确实不需要,因为并不完全需要简单的 hello world 控制台输入。
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多