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

Вниз

Бессовестно "глючит" встроенный в Д7 дебагер )..   Найти похожие ветки 

 
Digitman ©   (2005-09-23 14:39) [0]

Ув. колееги !

Баг вроде бы известный, но я просто не уловил момента, с которого у меня он начал проявляться - то ли еще до установки мной Д7-апдейта, то ли уже после ... надо бы определиться ... если у кого-то имеется под рукой прямые ссылки на инф-цию об этом баге и багофиксе (в 1-ю очередь от самого Борланда), прошу привести их здесь ..

Суть бага проста : дебагер при выводе, например, в окно Evaluate/Modify содержимого AnsiString-переменной бессовестно искажает реальное содержимое строки, если ее длина > 4096 (оч интересная цифирь, не правда ли ?) ... и искажает имеенно те данные, которые начинаются за упомянутой границей ... попросту - выводит черт-те какую область памяти, но только не ту что реально занимает стр.данные за этой границей ..

В принципе о баге этом в Д7 (в Д5 с этим все было в порядке) я где-то когда-то уже слышал, но до поры до времени он мне никак не мешал ...

Хотелось бы побыстрей определиться со своими дальнейшими "телодвижениями" по возможному устранению сей неприятности..


 
vecna ©   (2005-09-23 15:36) [1]

я могу ошибаться, но этот баг есть и в 6 дельфях.
по крайнем мере, мне там (со всеми апдейтами и патчами) доводилось видеть неадекватную картину.


 
Digitman ©   (2005-09-23 15:46) [2]

за 6-ку ничего не скажу - я не пользовал ее...

хочешь сказать, что баг выполз еще в 6-ке и плавно переехал в 7-ку со всей ее известной апдейт-ботвой ?


 
vecna ©   (2005-09-23 16:39) [3]

Digitman ©  [2]
Я ничего не хочу сказать, я практически не работал в 7ке.
Но наблюдал описаный вами косяк в 6: длинная строка отображалась не корректно по ctrlF7. Понаблюдал и забил на него... т.к. мне он не мешал =) собственно вот и все, даже деталей не помню, так как было давно.


 
alpet ©   (2005-09-23 16:46) [4]

Может помочь такая конструкция: PChar (PDWORD (@ss)^  + 4096)?

пример кода:

var
   ss: String;
    n: DWORD;
begin
SetLength (ss, 8192);
ss := "";
for n := 0 to 4095 do
    ss := ss + "%";
ss := ss + "test text";
if ss = "exit" then exit; // здесь поставить бряк и смотреть watch
end;


 
alpet ©   (2005-09-23 16:53) [5]

Для модификации можно попробывать PChar (PDWORD (@ss)^), но в любом случае содержимое строки в соотв. EDIT окна Evalute/Modify непомещается.

Выдается вот что: Line too long (more than 1023 characters).


 
Digitman ©   (2005-09-23 17:05) [6]


> alpet ©   (23.09.05 16:46) [4]


нет, не пойдет...

еще раз : меня волнует возможность самого дебагера (безо всяких впомог. прогр. выкрутасов)  показать мне полное и правильное содержимое моей строки


> alpet ©   (23.09.05 16:53) [5]


хочешь сказать, что проблема каким-то невероятным образом кроется именно в системных ограничениях для окна класса EDIT (64кбайт инф-ции)

?

но ведь, если не ошибаюсь, эти ограничения для НТ-based-систем сняты ?


 
alpet ©   (2005-09-23 17:38) [7]

Digitman ©   (23.09.05 17:05) [6]

Ограничения в килобайт (-1) устроены программистами Borland, полагавшими что никому в Turbo Pascal (а может в Turbo Debugger) не придет в голову создавать слишком большие строки. От этого и все проблемы.

Для отладки так-что придется юзать либо дамп в окне CPU, либо по частям модифицировать (для этого можно специальный вспомогательный класс сделать).


 
Digitman ©   (2005-09-23 18:08) [8]


> alpet ©   (23.09.05 17:38) [7]


> так-что придется юзать либо дамп в окне CPU, либо по частям
> модифицировать


уверенность твоя в отсутствии нативного решения 100%-я ?


 
alpet ©   (2005-09-23 18:21) [9]

Digitman ©   (23.09.05 18:08) [8]

Не уверен, что Borland сильно развивает встроенный отладчик. Так что если патча нет, решения нет тоже.

Вот кстати как методом "хака" можно использовать отладчик Delphi:

type
 HackStr = object
 protected
  function  GetHack (const s: string; offst: DWORD): PChar;
  procedure SetHack (const dst: string; offst: DWORD; const src: PChar);
 public
  temp: PCHAR;
  property  hack [const s: string; offst: DWORD]: PChar read GetHack write SetHack;
 end;

procedure HackStr.SetHack;
var px: PChar;
begin
px := @PChar (dst) [offst];
StrCopy (px, src);
end;

function HackStr.GetHack(const s: string; offst: DWORD): PChar;
begin
result := @PChar (s) [offst];
end;


Переменная класса HackStr объявляется где-нибудь среди глобальных переменных. Для обхода оптимизатора Delphi, вставляется след. код:

var s: string;
    hs: HackStr;
begin
s := "1";
if ( hs.hack [s, 0]  = "1") then hs.hack [s, 0] := "2";
end;


В окне Evalute|Modify соответственно глобальная переменная используется вместе с той которую нужно модифицировать (например g_hs.hack [somestr, 4096]).

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



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

Форум: "Потрепаться";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
5-1102872211
klyonov
2004-12-12 20:23
2005.10.16
Designtime и Runtime пакеты


1-1127387729
nastya
2005-09-22 15:15
2005.10.16
Наследование и виртуальные функции


5-1103129104
Anatoly
2004-12-15 19:45
2005.10.16
Коллекция после запуска пустая


4-1124012368
NeoMaster
2005-08-14 13:39
2005.10.16
ReadDirectoryChagesW на все логичесике диски


14-1127400606
Джо
2005-09-22 18:50
2005.10.16
Мирная тема.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский