Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Вниз

Как получить подробную информацию об ошибке рантайма?   Найти похожие ветки 

 
Abcdef123   (2008-09-01 06:02) [0]

Здравствуйте, Мастера.
Можно ли получить более подробное сообщение об ошибке рантайма?Дело в том, что у меня программа работает нормально, а у клиента выскакивает ошибка "List Index out of bounds(0)"
Я знаю, что означает эта ошибка, но хотелось бы конкретнее узнать, какой объект выдает ошибку (дело в том, что в этой программе несколько стринглистов используется, и трудно представить, в каком месте программы возникает эта ошибка. Причем клиент говорит, что ошибка возникает не каждый раз, то есть закономерность повторения ошибки не знаем. Я думаю, хорошо бы вставить в программу выдачу более подробной информации об ошибке, но я не знаю как. На данный момент в моем проекте просто считывается и выдается в случае ошибки Exception.Message.
Подскажите, что можно сделать?


 
Урсулапов   (2008-09-01 08:02) [1]

Ну эта... Вроде нужно пройтись с F8. Где выскакивает ошибка - там и ошибка, извините за каламбур.


 
@!!ex ©   (2008-09-01 08:28) [2]

> [1] Урсулапов   (01.09.08 08:02)

ага.. поехать к клиенту, установить на его компе дельфи... класс. :))

автор, веди лог проиходящего.


 
Abcdef123   (2008-09-01 09:44) [3]

to [1]
Да, это нереально поехать к клиенту и делать дебаг на компе клиента, а на моем работает нормально.

to [2] Извините, может примитивный вопрос, просто мне не приходилось это делать - А как вести лог происходящего?


 
@!!ex ©   (2008-09-01 10:00) [4]

> [3] Abcdef123   (01.09.08 09:44)


type
 TLogFile = class
 protected
   FFile:TextFile;
 public
   Constructor Create(const FileName:string);
   Destructor  Destroy(); override;
   Procedure   Add(const s:string);
 end;

Constructor TLogFile.Create(const FileName:string);
begin
 AssignFile(FFile,FileName);
 Rewrite(FFile);
end;

Destructor TLogFile.Destroy();
begin
 CloseFile(FFile);
 inherited;
end;

Procedure   TLogFile.Add(const s:string);
begin
 Writeln(FFile,s);
 Flush(FFile);
end;


 
DrPass ©   (2008-09-01 10:10) [5]


> Можно ли получить более подробное сообщение об ошибке рантайма?


Проще всего установить на Delphi трейсер ошибок, например, EurekaLog или MadExcept, и скомпилировать программу с ним.


 
Плохиш ©   (2008-09-01 10:13) [6]


> Проще всего установить на Delphi трейсер ошибок

Вообще-то, проще посмотреть исходник на предмет обращения к нулевому элементу или попытки удаления оного в пустом списке :-)


 
oldman ©   (2008-09-01 10:15) [7]


> а у клиента выскакивает ошибка "List Index out of bounds(0)


Автор, у тебя ошибка в программе.


 
Abcdef123   (2008-09-01 10:21) [8]

to [4]
Спасибо за код, но как я поняла, это описание(объявление) самого типа TLogFile. А как его использовать в проекте? То есть в каком месте надо обхявлять о его создании и где вызывать запись,
и что будет параметром s в процедуре TLogFile.Add(const s:string);


 
@!!ex ©   (2008-09-01 10:22) [9]

> [8] Abcdef123   (01.09.08 10:21)

С паскалью совсем не дружишь?
ДОгадаться что за параметр в процедуре Add так сложно?


 
Abcdef123   (2008-09-01 10:30) [10]

To [8]
Прошу прощения, - вопрос о параметре снимается (мне стыдно)

А вот как все же привязать создание этих логов в проекте не догоняю :-\


 
Плохиш ©   (2008-09-01 10:34) [11]


> А вот как все же привязать создание этих логов в проекте
> не догоняю

Стоит нанять программиста и дать ему для начала посмотреть ваш глюкокод.


 
Abcdef123   (2008-09-01 10:47) [12]

To [11]
да в том то и дело, что там где глючит - не моя программа, а написана программистом, который сейчас за свою работу в другой компании шикарно зарабатывает. И эта программа используется в нескольких проектах, никогда проблемы нам не создавала, только вот один клиент проблему высказал, и то она не всегда возникает, закономерности не может уловить.

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


 
Медвежонок Пятачок ©   (2008-09-01 10:51) [13]

Со временем и я буду считать этот вопрос примитивным.

А пока найми программиста


 
@!!ex ©   (2008-09-01 10:52) [14]

> [10] Abcdef123   (01.09.08 10:30)
> To [8]
> Прошу прощения, - вопрос о параметре снимается (мне стыдно)
>
>
> А вот как все же привязать создание этих логов в проекте
> не догоняю :-\

if SomeListBox.Lines.Count=0 then begin
  GlobalLogFile.Add("SomeListBox.Lines.Count=0");
end;

Ну или что-то в этом роде.

Хотя в вашем конкретном случае я бы повесил логирование на каждое действия обращения к 0 элементу листбокса. ТОгда сразу будет видно по логу где упало, когда упадет.


 
Плохиш ©   (2008-09-01 10:53) [15]


> Abcdef123   (01.09.08 10:47) [12]


> >Стоит нанять программиста
> ну а насчет этого комментария - вам нравится обижать людей?

Ну во-первых, мне не нравиться обижать людей, но я не люблю людей которые занимают чужое место.
А во-вторых, судя по [8] Вы пытаетесь заменить чтение книг по основам программирования вопросами на форуме.


 
Vlad Oshin ©   (2008-09-01 12:13) [16]


> А вот как все же привязать создание этих логов в проекте
> не догоняю :-\

заворачивать в конструкцию try except


try
 //Полезный код
 ADOConnection1.Connected:=true;//например

except
 on E:Exception do
    begin
      GlobalLogFile.Add("//Полезный код"+E.ClassName+e.Message);
      raise; //или без этой строки, если не нужно показывать ошибку или считаете, что она обработатна
    end;
end;


 
Abcdef123   (2008-09-01 12:24) [17]

To [15]
>я не люблю людей которые занимают чужое место.
Если вы согласитесь работать за такую зарплату в фирме, где я работаю, то я вам уступлю это "чужое" место. Хозяин этой фирмы платит мало, так что очень продвинутые программисты сюда не идут. Вообще место программиста анализировать как "занимать чужое место" на мой взгляд не логично. Это не кресло начальника. И у каждого в жизни есть своя ниша, я, например, не претендую считать себя супер программером, и у меня хватило бы ума не претендовать на ваше место, или чье-то другое, которое мне не по плечу.
>Вы пытаетесь заменить чтение книг по основам программирования вопросами на форуме
Ну тут вы не правы в принципе, так как я читаю книги тоже. Я задаю здесь вопросы согласно правилам форума, и если я задала вопрос, на который отвечать долго, то можно было просто дать ссылку, какую литературу почитать по данному вопросу, а не обижать без причины.

Большое спасибо @!!ex.  Вы мне помогли! Я поняла!


 
Медвежонок Пятачок ©   (2008-09-01 12:48) [18]

Корнет, вы - женщина?!


 
Anatoly Podgoretsky ©   (2008-09-01 13:07) [19]

> Abcdef123  (01.09.2008 10:47:12)  [12]

Исходники есть? Если есть, то во всех местах где есть обращение к ListBox.
Ошибка простая, в какой то ListBox ничего не попало, но зато есть обращение к нулевому элементу без проверки на допустимость такого обращения. Хорошо, что хоть проверка диапазонов включена, иначе бы ошибки были по AV


 
Vlad Oshin ©   (2008-09-01 13:43) [20]

а еще удобнее, жать ctrl shift G

try
//ctrl shift G, получаем что-то вроде: ["{F560BE95-8E7B-4CCB-8D20-072B7C60980C}"], комментируем строку, итого имеем

// ["{F560BE95-8E7B-4CCB-8D20-072B7C60980C}"]
ADOConnection1.Connected:=true;//например

except
on E:Exception do
   begin
     GlobalLogFile.Add("F560BE95-8E7B-4CCB-8D20-072B7C60980C"+E.ClassName+e.Message); // сюда вставим этот GUID
     raise; //или без этой строки, если не нужно показывать ошибку или считаете, что она обработатна
   end;
end;

Затем, анализируя лог, копируем строчку(guid) и ищем в файлах(search-find in files) этот GUID.


 
Vayrus   (2008-09-02 10:29) [21]


> Ошибка простая, в какой то ListBox ничего не попало, но
> зато есть обращение к нулевому элементу без проверки на
> допустимость такого обращения.


Такая ошибка обычно возникает если пользователь обращается к неотмеченной строчке в списке. Т.е. он жмет, например, кнопку удалить, а в списке то элемент не выбран!
При каждом обращении к любому ListBox делайте в начале проверку примерно такого содержания:


if ListBox1.ItemIndex = 0 then
begin
ShowMessage("Элемент не выбран!");
EXIT;
end;


Или что то в этом духе, в зависимости от условий, н-р,

if ListBox1.Items.Count = 0 then EXIT;

или

if ListBox1.SelCount = 0 then EXIT;


 
Плохиш ©   (2008-09-02 12:10) [22]


> if ListBox1.ItemIndex = 0 then
> begin
> ShowMessage("Элемент не выбран!");

Врать не надо.


 
@!!ex ©   (2008-09-02 12:42) [23]

> [21] Vayrus   (02.09.08 10:29)

Не выбранный элемент - это минус 1.


 
Vayrus   (2008-09-02 14:35) [24]

> Врать не надо.

Я и не вру, человеку свойственно ошибаться.


 
Vayrus   (2008-09-02 14:37) [25]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
2-1220869518
koha!
2008-09-08 14:25
2008.10.12
пару вопросов по отладке приложений


15-1219213129
rx275d7_jedi
2008-08-20 10:18
2008.10.12
rx275d7_jedi


2-1220861648
Nameziz
2008-09-08 12:14
2008.10.12
Поиск


2-1219920043
biver64
2008-08-28 14:40
2008.10.12
Удаление файла


15-1219126004
vajo
2008-08-19 10:06
2008.10.12
Подскажите с драйвером?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский