Форум: "Потрепаться";
Текущий архив: 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