如何调试启动但似乎什么都不做的程序?

时间:2011-10-25 22:01:17

标签: c++ debugging ubuntu terminal

我目前有2台虚拟机正在运行,一台是服务器,一台是客户端。他们都在运行Ubuntu。我创建了一个C ++程序来连接到MYSQL服务器。当我打开服务器VM中的终端时,c ++程序编译并运行完美!

但是,当我尝试在客户端上运行它时,它根本不起作用。代码编译完全正常但是当我输入“ ./ main ”来启动程序时,NOTHING出现了。这只是一个空白的屏幕。我完全不明白为什么会这样。客户端和服务器上的代码完全相同,但由于某种原因,当我在客户端运行它时,它不会显示我的任何代码。下面是图片,以显示我的意思

这是一个链接,可以查看我所谈论的屏幕截图(http://imgur.com/a/QqgPV)。在第一张图片中,我编译了编译好的程序。然后我运行程序但没有输出到屏幕。

第二张图显示正在服务器上运行的程序,并显示在初始 ./ main 命令

之后在屏幕上输出的内容

我该怎么做才能找出问题所在?

3 个答案:

答案 0 :(得分:2)

使用“-g -ggdb”编译并在调试器中运行:

$ cgdb --args ./main your_args

当它阻止按住Ctrl-C并键入“bt”时。这将告诉你程序停止的位置。 可能有很多东西阻塞你的代码(你使用外部的东西,比如数据库)。

给我们一些分析代码。没有具体细节,我们无法帮助。

BTW:它编译的事实并不意味着它会完美运行。

答案 1 :(得分:1)

将日志记录添加到您的程序中或在strace下运行它以确定它被卡住的位置或等待的内容。

在最基本的级别,您可以通过添加日志语句来添加日志记录。说你的代码如下:

a();
b();
c();
output_stuff();

暂时将其更改为:

cout << "about to do a" << endl;
a();
cout << "about to do b" << endl;
b();
cout << "about to do c" << endl;
c();
cout << "done with c" << endl;
output_stuff();

然后看看你得到了什么消息。如果你没有“即将做”,那么它就是一个全局对象或进程初始化的构造函数。如果你“即将做”而不是“即将做b”,那么a()就是悬而未决。等等。

答案 2 :(得分:0)

在启用调试符号的情况下构建程序(GCC -g选项)

$ cat infinite.cpp 
void infinite()
{
    for(;;)
    {
    }
}

int main()
{
    infinite();
}
$ g++ -g infinite.cpp

运行你的程序:

$ ./a.out

打开新的终端会话

找出你的程序的PID是什么

$ ps x | grep a.out
7817 pts/3    R+     0:08 ./a.out

运行gdb并将其附加到您的程序(如果您获得权限错误,则为sudo):

$ gdb
...
(gdb) attach 7817
Attaching to process 7817
...
Loaded symbols for /lib64/ld-linux-x86-64.so.2
infinite () at infinite.cpp:3
3       for(;;)
(gdb) backtrace
#0  infinite () at infinite.cpp:3
#1  0x0000000000400513 in main () at infinite.cpp:10

使用调试器检查程序的执行点,设置断点,检查程序的状态(可能循环计数器之一是无符号整数和溢出等)。