Форум программистов, компьютерный форум CyberForum.ru

дебаг - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
14.11.2011, 02:27     дебаг #1
Как дебажить написаный код? Спасибо компилятору хоть тыкает носом на очевидные ошибки, но когда код компилируется и сразу после запуска программа вылетает, что делать в таком случае? Как узнать по какой причине она вылетает?
Использую code blocks с minGW, там вроде и дебагер какойто есть но не могу понять как им пользоватся.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 02:27     дебаг
Посмотрите здесь:

Дебаг в еклипсе Perl
C++ Различия дебаг, релиз
C++ Дебаг тупит
Релиз и дебаг C++
Только с дебаг Assembler
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
g-man
8 / 8 / 1
Регистрация: 02.04.2010
Сообщений: 25
14.11.2011, 02:37     дебаг #2
f8 и вперед
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
14.11.2011, 02:46  [ТС]     дебаг #3
хмм.. ну вроде и правда работает, но вот та информация мнени о чём не говорит
Вот что выдало, и что теперь с этим делать?
Код
#0 77975C2C	ntdll!RtlQueryEnvironmentVariable_U() (C:\Windows\system32\ntdll.dll:??)
#1 77973496	ntdll!RtlUnicodeStringToOemString() (C:\Windows\system32\ntdll.dll:??)
#2 7797353A	ntdll!RtlUnicodeStringToOemString() (C:\Windows\system32\ntdll.dll:??)
#3 779E5003	ntdll!RtlpSetUserPreferredUILanguages() (C:\Windows\system32\ntdll.dll:??)
#4 779A7E1E	ntdll!RtlTraceDatabaseValidate() (C:\Windows\system32\ntdll.dll:??)
#5 7797353A	ntdll!RtlUnicodeStringToOemString() (C:\Windows\system32\ntdll.dll:??)
#6 773E9D45	msvcrt!malloc() (C:\Windows\system32\msvcrt.dll:??)
#7 00000000	0x00403cc5 in ??() (??:??)
#8 00000000	0x00000001 in ??() (??:??)
#9 00000000	0x0000000e in ??() (??:??)
#10 00000000	0xfffffdce in ??() (??:??)
#11 00000000	0x00000024 in ??() (??:??)
#12 00000000	0x00000001 in ??() (??:??)
#13 00000000	0x00000000 in ??() (??:??)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 03:39     дебаг #4
Цитата Сообщение от OrmaJever
и сразу после запуска программа вылетает
надо определить место возникновения ошибки
с помощью printf("here\n"); (несколько строк в подозрительных местах)
до ошибки будет всё выводиться, после ошибки не будет ничего выводиться
Bers
Заблокирован
14.11.2011, 03:56     дебаг #5
а брейкпоинтов нету в кодеблоке что ли?)
g-man
8 / 8 / 1
Регистрация: 02.04.2010
Сообщений: 25
14.11.2011, 17:01     дебаг #6
и сразу после запуска программа вылетает

Исходник в студию
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
14.11.2011, 18:30  [ТС]     дебаг #7
Цитата Сообщение от accept Посмотреть сообщение
надо определить место возникновения ошибки
с помощью printf("here\n"); (несколько строк в подозрительных местах)
до ошибки будет всё выводиться, после ошибки не будет ничего выводиться
Ну раньше я коментировал подозрительные строки и смотрел без какой будет работать, потом перечитывая описание функции/конструкции пытался понять почему не работает. Но код становится больше и эта процедура слишком долгая и нудная.
Цитата Сообщение от Bers Посмотреть сообщение
а брейкпоинтов нету в кодеблоке что ли?)
Скоренько в гугле прочитал что это такое, но вот как ими пользоватся имено в code blocks незнаю, может подскажите?
Цитата Сообщение от g-man Посмотреть сообщение
и сразу после запуска программа вылетает

Исходник в студию
Ну исправите вы мне щас ошибку, а на следуйщую мнетоже создавать тему и скидывать код? и так по 10 раз за час? Нунжо самому учится их находить.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.11.2011, 18:43     дебаг #8
Цитата Сообщение от OrmaJever Посмотреть сообщение
Нунжо самому учится их находить
Нужно учиться писать безопасный код
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 18:49     дебаг #9
Цитата Сообщение от OrmaJever Посмотреть сообщение
#6 773E9D45 msvcrt!malloc() (C:\Windows\system32\msvcrt.dll:??)
Ошибка произошла в одном из вызовов malloc. Большего сказать не могу, так как ваши ментальные волны доходят до меня с большими помехами. Не думайте из подземного перехода.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
14.11.2011, 18:56  [ТС]     дебаг #10
Ну вот я заметил что большинство моих ошибок из-за выделения памяти
Вот большойкусок кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void SetText(HWND elem, char *str) {
    int textsize = GetWindowTextLength(elem);
    char *newStr = new char[textsize + strlen(str) + 5];
    if(textsize != 0) {
        char *Text = new char[textsize + 1];
        GetWindowText(elem, Text, textsize);
        strcat(newStr, Text);
        delete[] Text;
    }
    strcat(newStr, str);
    SetWindowText(elem, strcat(newStr, "\r\n"));
    delete[] newStr;
}
функция должна дописывать текст в текстовое поле, но вот проблема с памятью, беру много памяти - ошибка, мало - тоже ошибка. Вызывается примерно так
C++
1
2
3
// поле куда нужно написать текст
Static = CreateWindow("STATIC", 0, WS_VSCROLL | WS_VISIBLE | WS_CHILD, 10,70,360,180, hwnd, (HMENU)B_SEND, hThisInstance, NULL);
SetText(Static, "sended");
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 23:32     дебаг #11
Цитата Сообщение от OrmaJever
Ну раньше я коментировал подозрительные строки и смотрел без какой будет работать, потом перечитывая описание функции/конструкции пытался понять почему не работает. Но код становится больше и эта процедура слишком долгая и нудная.
не надо комментировать, нужно делать вывод на экран
1) комментирование меняет программу
2) комментирование/раскомментирование занимает много времени
3) с комментированием всё так же нет вывода на экран (ты можешь думать, что происходит одно, а происходит другое)

Цитата Сообщение от OrmaJever
Вот большойкусок кода
это маленький кусок кода
нет ни одного комментария

Цитата Сообщение от OrmaJever
C++
1
    char *newStr = new char[textsize + strlen(str) + 5]
вот, например, strlen(str) + 5, что за плюс пять
это надо комментировать, сам же потом не вспомнишь

Цитата Сообщение от OrmaJever
C++
1
void SetText(HWND elem, char *str) {
если строку не меняешь, у неё должен стоять const (это прояснит полфункции)

Цитата Сообщение от OrmaJever
C++
1
    strcat(newStr, str);
когда память выделил, нужно сделать *newStr = '\0';
потому что strcat() сначала проматывает до нуль-символа, а потом на него присоединяет
а если ты не сделал так, то она проматывает мусор, пока случайно не найдёт в нём нуль-символ

Цитата Сообщение от OrmaJever
C++
1
        GetWindowText(elem, Text, textsize);
то же самое, убедись, что она записывает нуль-символ в Text после всех символов
и вообще, зачем тебе этот временный Text ?
делай strcpy() напрямую в newStr
Bers
Заблокирован
15.11.2011, 00:09     дебаг #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
Скоренько в гугле прочитал что это такое, но вот как ими пользоватся имено в code blocks незнаю, может подскажите?
Я сам в студии пишу. А кодеблок даже в глаза ни разу не видел.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
15.11.2011, 16:13  [ТС]     дебаг #13
Цитата Сообщение от accept Посмотреть сообщение
вот, например, strlen(str) + 5, что за плюс пять

это вот из этой строки strcat(newStr, "\r\n"). Я ж так понимаю тут 4 символа а не 2? Ну и +1 завершабщий символ
Цитата Сообщение от accept Посмотреть сообщение
если строку не меняешь, у неё должен стоять const (это прояснит полфункции)
Уменя с этим const бывают проблемы. Например если я обьясвлю в функцию как const, в внутри этой функции вызову другую которая принимает не const и уже ошибки.
Цитата Сообщение от accept Посмотреть сообщение
когда память выделил, нужно сделать *newStr = '\0';
потому что strcat() сначала проматывает до нуль-символа, а потом на него присоединяет
а если ты не сделал так, то она проматывает мусор, пока случайно не найдёт в нём нуль-символ
Ну вот в этом у меня и была проблема, я не знал как точно работает strcat, поэтому у меня всегда вначале текста дописывались лишние символы, а нужные потом не вмещались в память.

то же самое, убедись, что она записывает нуль-символ в Text после всех символов
и вообще, зачем тебе этот временный Text ?
делай strcpy() напрямую в newStr
Как, GetWindowText не возвращает строку, указатель на память принимается вторым параметром, и туда же записывается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 23:42     дебаг
Еще ссылки по теме:

Дебаг процедуры Oracle
C++ Как вывести информацию из таблицы виртуальных символов в дебаг?
Не читает файл в папке дебаг. Уже везде его пихал, а программа не работает C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2011, 23:42     дебаг #14
Цитата Сообщение от OrmaJever
Я ж так понимаю тут 4 символа а не 2?
а, это два символа

Цитата Сообщение от OrmaJever
Ну и +1 завершабщий символ
это правильно

Цитата Сообщение от OrmaJever
Уменя с этим const бывают проблемы. Например если я обьясвлю в функцию как const, в внутри этой функции вызову другую которая принимает не const и уже ошибки.
если строку не меняешь, то для неё нельзя вызывать функцию с не const
если хочешь вызвать функцию с не const для строки, которую не нужно менять, сделай копию строки

Цитата Сообщение от OrmaJever
Как, GetWindowText не возвращает строку, указатель на память принимается вторым параметром, и туда же записывается.
надо убрать Text

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void SetText(HWND elem, const char *str)
{
    int textsize;
    char *newStr;
    
    textsize = GetWindowTextLength(elem);
    newStr = new char[textsize + strlen(str) + 1];
    *newStr = '\0';
    if(textsize != 0)
        GetWindowText(elem, newStr, textsize);
    strcat(newStr, str);
    strcat(newStr, "\r\n");
    SetWindowText(elem, newStr);
    delete [] newStr;
}
ещё нужно посмотреть, что может вернуть функция GetWindowTextLength()
не бывает ли там отрицательных чисел
Yandex
Объявления
15.11.2011, 23:42     дебаг
Ответ Создать тему
Опции темы

Текущее время: 12:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru