LINUX.ORG.RU

Как отлавливать ошибки при запуске и работе программы?

 , ,


0

1

Вот программа:

#include <gtk/gtk.h>
#include <glib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;



static void click1_cb (GtkButton *btn1, gpointer user_data, int & n) {
 const gchar *s;


  s = gtk_button_get_label (btn1);
  if (g_strcmp0 (s, "Hello.") == 0) {
    gtk_button_set_label(btn1, "Good-bye.");
    n = 1;
  } else {
    gtk_button_set_label(btn1, "Hello.");
       n = 2;
}

 }

string GetStdoutFromCommand(string cmd) {
  string data;
  FILE * stream;
  const int max_buffer = 256;
  char buffer[max_buffer];
  cmd.append(" 2>&1");

  stream = popen(cmd.c_str(), "r");
  if (stream) {
    while (!feof(stream))
      if (fgets(buffer, max_buffer, stream) != NULL) data.append(buffer);
    pclose(stream);
  }
  return data;
}


static void
  app_activate (GApplication *app, gpointer user_data) {


  GtkWidget *win;
  GtkWidget *box;
  GtkWidget *btn1;
  GtkWidget *label;
  GtkWidget *label2;
  GtkWidget *grid;
  GtkWidget *textview = gtk_text_view_new();

 int n = 0;

  // app is new
 win = gtk_application_window_new (GTK_APPLICATION (app));
  gtk_window_set_title (GTK_WINDOW (win), "win");
   gtk_window_set_default_size (GTK_WINDOW (win), 500, 300);


// setup box1
  box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
  gtk_widget_set_halign (box, GTK_ALIGN_START);
  gtk_widget_set_valign (box, GTK_ALIGN_START);
  gtk_window_set_child (GTK_WINDOW (win), box);

// setup labels
	//label = gtk_label_new(GetStdoutFromCommand("netstat -tuwapn").c_str());
	//GetStdoutFromCommand("netstat -tuwapn").c_str()
        label = gtk_label_new("dfgdf");
        gtk_label_set_markup(GTK_LABEL(label), "<span font_desc=\"sans 20\">Network Connections</span>);");
       // label2 = gtk_label_new(GetStdoutFromCommand("netstat -tuwapn").c_str());
        //gtk_label_set_markup(GTK_LABEL(label2), "<span style=\"bold\">%s</span>");
// button
  btn1 = gtk_button_new_with_label ("Reload.");
  g_signal_connect (btn1, "clicked", G_CALLBACK(click1_cb), &n);
  gtk_widget_set_margin_top (btn1, 1);

// grid
	grid = gtk_grid_new ();
	gtk_grid_set_row_spacing (GTK_GRID (grid), 1);
    gtk_window_set_child (GTK_WINDOW (win), grid);
	gtk_grid_attach (GTK_GRID (grid), btn1,20, 3, 20, 50);
	gtk_grid_attach (GTK_GRID (grid), label,200, 3, 200, 50);
//	gtk_grid_attach (GTK_GRID (grid), label2,300, 4, 50, 50);
	  
// show window
   gtk_widget_show (win);
}
 int main (int argc, char **argv) {
  GtkApplication *app;
 int stat;

 app = gtk_application_new ("gtk.org", G_APPLICATION_FLAGS_NONE);
 g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
 stat =g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
  return stat;
}

Все синтаксически правильно, программа компилируется на linux’e g++ xfce. Но, при работе она сама закрывается так и не выполнив весь код. Конкретно ошибка, в этой части кода, когда присываивается цифра переменной типа int.

static void click1_cb (GtkButton *btn1, gpointer user_data, int & n) {
 const gchar *s;


  s = gtk_button_get_label (btn1);
  if (g_strcmp0 (s, "Hello.") == 0) {
    gtk_button_set_label(btn1, "Good-bye.");
    n = 1;
  } else {
    gtk_button_set_label(btn1, "Hello.");
       n = 2;
}

 }

когда удаляю строки n = 1 и n = 2; прорамма нормально работает. Вот, вопрос,возможно, нужно присваивать не int и указателю на *int? И какой тулзой можно посмотретьь, при запуске и работе такого bin файла, почему он впадает в crash, т.е.сам выключается?



Последнее исправление: wersto8top (всего исправлений: 1)

С помощью отладчика gdb можно выяснить и место падения, и, при необходимости, отлаживать программу пошагово

annulen ★★★★★
()
Ответ на: комментарий от annulen

Выполнил команду gdb test получил:

Reading symbols from test...
(No debugging symbols found in test)
(gdb) 
(gdb) 

в общем, не находит ошибки…но gdb ищет именно ошибки синтаксиса..а у меня другая проблема, эта программа (эти исходные коды), похоже делают какое-то переполнение ram или еще что-то и поэтому программа закрывается. Возможно, ей нужно выделить больше памяти memory для работы? не знаю,что именно? почему она закрывается?

wersto8top
() автор топика

Можно ли выучить программирование с помощью только лишь форума? Смотрите в следующих темах. To be continued…

Keltir
()
Ответ на: комментарий от wersto8top

нужно собрать программу с отладочной информацией, флаг -g в gcc

hibou ★★★★★
()
Ответ на: комментарий от wersto8top

Gdb не будет тебе магическим образом искать ошибки в твоей приложухе, т.к. это отладчик, а не статический анализатор. Во-первых, отладку лучше запускай из твоей IDE, а во вторых не забывай включать генерацию отладочных данных во время конпеляции, тебе ж вон gdb говорит:

(No debugging symbols found in test)

А для начала… Может все-таки попробуешь Gtkmm, раз ты именно кресты хочешь? А то знаешь, гтк он для Цэ, там страшные указатели, из-за которых твоя аппликуха падает.

Unicode4all ★★★★★
()
Последнее исправление: Unicode4all (всего исправлений: 1)

Не совсем понял, это си-шка или с++?

Если С++, то наверное вот тут не так надо, поскольку С++ и так по заголовку функции поймет, что надо ссылку туда передать. А ты получается передаешь адрес как ссылку.

g_signal_connect (btn1, «clicked», G_CALLBACK(click1_cb), &n);

Если это си-шка, то надо бы изменить заголовок функции, убрать из заголовка передачу по ссылке и вставить вместо нее передачу по указателю. То есть в этой строке:

static void click1_cb (GtkButton *btn1, gpointer user_data, int & n)

заменить &n на *n.

hibou ★★★★★
()
Ответ на: комментарий от firkax

Увы и ах.

Но всё в твоих руках. Всё, что нужно для победы: купить макбук и пролоббировать соответствующее правило.

Unicode4all ★★★★★
()

А ни чё, что обычный int передавать по ссылки/указателю бессмысленно.
P.S. Я несколько удивлён, что ТС пытается что-то сваять на крестах, а не на scratch или python.

Dr64h ★★
()
Ответ на: комментарий от Dr64h

Судя по коду, он пытается не передать инт в функцию, а вернуть из функции его. Только глупенький и делает это не через user_data, а через новый параметр не предусмотренный api callback-а поэтому там или стек повреждается или идёт запись в область кода библиотеки

cobold ★★★★★
()
Ответ на: комментарий от Dr64h

Мне не важно на чем писать, но в конечном итоге я хочу получить snap или deb-пакет для «попытки размещения» его на snapcfraft.io (snap), launchpad.net (deb) или packages.ubuntu.com (deb). И похорошему, эта готовая программа, в виде пакета, должна занимать 10-200mb, а не несколько гигабайт.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

В общем, я думаю, я вам больше не нужен. Можете, втягивать других людей из рф в написание исходных кодов для приложений/игр для opensource, путем «задавания вопросов» на форумах, как это делаю я. Я более, вам не нужен, только ворую ваше время.Плюс, «главные интернета», могут выкладывать больше исходных кодов в интернет, в паблик, именно по приложениям и играм для opensource для рф.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

Желаю успеха!

Обязательно сообщи, когда твоя программа будет доступна в снапе (или ещё где), чтобы я её случайно не установил.

rupert ★★★★★
()

Конкретно ошибка, в этой части кода, когда присываивается цифра переменной типа int.

Нет, ошибка в том, что сингатура колбэка должна быть иной, в итоге ты из него пишешь куда-то в стек ГТК, и там уже как повезёт, в худшем случае отработает без падения, но у тебя есть корка, можешь посмотреть стек вызовов:

$ coredumpctl
...
your_app

$ coredumpctl debug your_app
bt

но тебе это здесь мало поможет. Для безусловного отлова подобных проблем (а не как повезёт) компиль отадочную версию с санитайзером -fsanitize=address, он тебе не скажет, что ты передал неправильный колбэк, но отсутствие ошибок даст некоторую уверенность.

kvpfs ★★
()

В си можно использовать electric fence, очень полезная вещь, отслеживает обращения за пределы выделенной области памяти

IvanR ★★★
()
Ответ на: комментарий от IvanR

electric fence

В наше время уже не актуален, есть asan и valgrind

annulen ★★★★★
()
Ответ на: комментарий от wersto8top

Не волнуйся, ты никогда и не был нужен.

Miguel ★★★★★
()
Ответ на: комментарий от kvpfs

Для безусловного отлова подобных проблем (а не как повезёт) компиль отадочную версию с санитайзером -fsanitize=address

Добавлю - сильно сомневаюсь, что сказал правду, скорее всего вероятность отлова такой ерунды примерно такая же как и у классического сброса корки - если испортим некоторый указатель и потом по нему сходим. В общем, скорее всего, никаких гарантий Asan здесь не даст. И если нужна безопасность, то нужно что-то более типобезопасное, возможно gtkmm, о котором говорили выше.

kvpfs ★★
()
Последнее исправление: kvpfs (всего исправлений: 1)
Ответ на: комментарий от wersto8top

По отдельности слова понятны, но в составе предложений - какой-то бред.

gruy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.