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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

дебаг - C++

14.11.2011, 02:27. Просмотров 1210. Ответов 13
Метки нет (Все метки)

Как дебажить написаный код? Спасибо компилятору хоть тыкает носом на очевидные ошибки, но когда код компилируется и сразу после запуска программа вылетает, что делать в таком случае? Как узнать по какой причине она вылетает?
Использую code blocks с minGW, там вроде и дебагер какойто есть но не могу понять как им пользоватся.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 02:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос дебаг (C++):

Дебаг тупит - C++
Здравствуйте. Когда запускаю debug, у меня пропускаются некоторые строчки, в Locals некоторые переменные(объекты класса) не показываются. ...

Релиз и дебаг - C++
#include <stdio.h> #include <iostream> #include <string> #include <math.h> int timer, timer_1; int r, fi, x; double T; double...

Различия дебаг, релиз - C++
Доброго времени суток всем. Объясните кто может почему Visual Studio 2010 программа в дебаге конфигурации работает как надо а в релиз...

Пустые дебаг методы vs полное выпиливание с проекта - C++
Добрый вечер, #include <string> using namespace std; //////////////////////////////////////////////////////////////////////////...

Как вывести информацию из таблицы виртуальных символов в дебаг? - C++
Собственно у класса есть виртуальная таблица, можно ли её напрямую читать и если да, то как допустим вывести из неё в какую - нибуть...

Не читает файл в папке дебаг. Уже везде его пихал, а программа не работает - C++
#include <iostream> #include <fstream> //#include <chrono> #include <string> using namespace std; class EmptyQueueException{ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
g-man
8 / 8 / 1
Регистрация: 02.04.2010
Сообщений: 25
14.11.2011, 02:37 #2
f8 и вперед
1
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 ??() (??:??)
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2011, 03:39 #4
Цитата Сообщение от OrmaJever
и сразу после запуска программа вылетает
надо определить место возникновения ошибки
с помощью printf("here\n"); (несколько строк в подозрительных местах)
до ошибки будет всё выводиться, после ошибки не будет ничего выводиться
0
Bers
Заблокирован
14.11.2011, 03:56 #5
а брейкпоинтов нету в кодеблоке что ли?)
0
g-man
8 / 8 / 1
Регистрация: 02.04.2010
Сообщений: 25
14.11.2011, 17:01 #6
и сразу после запуска программа вылетает

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

Исходник в студию
Ну исправите вы мне щас ошибку, а на следуйщую мнетоже создавать тему и скидывать код? и так по 10 раз за час? Нунжо самому учится их находить.
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.11.2011, 18:43 #8
Цитата Сообщение от OrmaJever Посмотреть сообщение
Нунжо самому учится их находить
Нужно учиться писать безопасный код
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.11.2011, 18:49 #9
Цитата Сообщение от OrmaJever Посмотреть сообщение
#6 773E9D45 msvcrt!malloc() (C:\Windows\system32\msvcrt.dll:??)
Ошибка произошла в одном из вызовов malloc. Большего сказать не могу, так как ваши ментальные волны доходят до меня с большими помехами. Не думайте из подземного перехода.
1
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");
0
accept
4822 / 3243 / 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
0
Bers
Заблокирован
15.11.2011, 00:09 #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
Скоренько в гугле прочитал что это такое, но вот как ими пользоватся имено в code blocks незнаю, может подскажите?
Я сам в студии пишу. А кодеблок даже в глаза ни разу не видел.
0
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 не возвращает строку, указатель на память принимается вторым параметром, и туда же записывается.
0
accept
4822 / 3243 / 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()
не бывает ли там отрицательных чисел
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2011, 23:42
Привет! Вот еще темы с ответами:

Дебаг процедуры - Oracle
Всем привет! Захотелось дебажить процедуру. Столкнулся с проблемами. С одной стороны в PL/SQL Developer есть функционал под дебаг. С...

Только с дебаг - Assembler
А вот еще такой вопрос; можно ли работать только с дебаг и не переключаться ненакакие высокого уровня компиляторы? И если это возможно(в...

Дебаг в еклипсе - Perl
Пишу на Perl в еклипсе (под windows xp). очень удобно в ней работать, но есть проблема - дебаг не работает. при попытке дебага выдает...

Дебаг в Chrome - JavaScript
Пытаюсь выполнить console.log(); и выдаёт вот что. Как сделать так, что бы выводило в столбик, а не один рядок вывело и остановилось, а...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.11.2011, 23:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru