Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Бессовестно "глючит" встроенный в Д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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.074 c
8-1116755107
MACTEP'oK
2005-05-22 13:45
2005.10.16
DirectSound. Проблема с записью длительного звукового потока .


1-1127845324
Aibolit
2005-09-27 22:22
2005.10.16
вопрос с формами


2-1127120802
azamatufa
2005-09-19 13:06
2005.10.16
Массив из элекментов типа MyClass (так сказать)


1-1127585260
Fostr
2005-09-24 22:07
2005.10.16
Преобразование картинок


6-1118477015
Shizuku
2005-06-11 12:03
2005.10.16
AutoUpdate