我目前有2台虚拟机正在运行,一台是服务器,一台是客户端。他们都在运行Ubuntu。我创建了一个C ++程序来连接到MYSQL服务器。当我打开服务器VM中的终端时,c ++程序编译并运行完美!
但是,当我尝试在客户端上运行它时,它根本不起作用。代码编译完全正常但是当我输入“ ./ main ”来启动程序时,NOTHING出现了。这只是一个空白的屏幕。我完全不明白为什么会这样。客户端和服务器上的代码完全相同,但由于某种原因,当我在客户端运行它时,它不会显示我的任何代码。下面是图片,以显示我的意思
这是一个链接,可以查看我所谈论的屏幕截图(http://imgur.com/a/QqgPV)。在第一张图片中,我编译了编译好的程序。然后我运行程序但没有输出到屏幕。
第二张图显示正在服务器上运行的程序,并显示在初始 ./ main 命令
之后在屏幕上输出的内容我该怎么做才能找出问题所在?
答案 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
使用调试器检查程序的执行点,设置断点,检查程序的状态(可能循环计数器之一是无符号整数和溢出等)。