Как я могу отладить программу, которая запускается, но, кажется, ничего не делает? - PullRequest
0 голосов
/ 26 октября 2011

В настоящее время у меня работают 2 виртуальные машины, одна из которых является сервером, а другая - клиентом.Они оба работают на Ubuntu.Я создал программу на C ++ для подключения к серверу MYSQL.Когда я открываю терминал в виртуальной машине сервера, программа c ++ компилируется и запускается ОТЛИЧНО!

НО, когда я пытаюсь запустить его на клиенте, он вообще не будет работать.Код прекрасно компилируется, но когда я набираю ". / Main ", чтобы запустить программу, НИЧЕГО не появляется.Это просто пустой экран.Я совершенно не понимаю, почему это происходит.Код абсолютно одинаков как на клиенте, так и на сервере, но по какой-то причине он не отображает ЛЮБОЙ мой код, когда я запускаю его на стороне клиента.Ниже приведены фотографии, показывающие, что я имею в виду

Вот ссылка для просмотра снимка экрана с тем, о чем я говорю (http://imgur.com/a/QqgPV). На первом рисунке я скомпилирую программу, которая прекрасно компилируется.затем запустите программу, но НИЧЕГО не выводит на экран.

На втором рисунке показана программа, запускаемая на сервере, и показано, что предполагается выводить на экран после начального . / main команда

Что я должен сделать, чтобы узнать, что происходит не так?

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

Скомпилируйте с помощью -g -ggdb и запустите его в отладчике:

$ cgdb --args ./main your_args

Когда он блокирует нажатие клавиш Ctrl-C и набирает «bt». Это скажет вам, где остановилась программа. Там может быть несколько миллиардов вещей, блокирующих ваш код (вы используете внешние вещи, такие как БД).

Дайте нам код для анализа. Мы не можем помочь без конкретной информации.

Кстати: тот факт, что он компилируется, не означает, что он будет работать без ошибок.

1 голос
/ 26 октября 2011

Добавьте запись в свою программу или запустите ее под 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();

Тогда посмотри, какие сообщения ты получаешь. Если вы не «собираетесь делать», то это конструктор для глобальной инициализации объекта или процесса, который зависает. Если вы «собираетесь делать a», но не «собираетесь делать b», значит, это a(), что зависает. И так далее.

0 голосов
/ 26 октября 2011

Сборка вашей программы с включенными символами отладки (опция GCC -g)

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

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

Запустите вашу программу:

$ ./a.out

Откройте новый сеанс терминала

УзнайтеЧто такое PID вашей программывыполнение - это ваша программа, установка точек останова, проверка состояния вашей программы (возможно, одним из счетчиков циклов является целое число без знака и переполнения и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...