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

Вниз

Запускаю из среды - нет ошибки. Запускаю ехе - есть :(((   Найти похожие ветки 

 
Franzy   (2009-04-23 14:35) [0]

Столкнулся с совершенно непонятной вещью. Запускаю прогу из среды (Д7) - работает нормально. Запускаю скомпилированный файл - вылазит ошибка Access Violation в библиотеке ntdll.dll. Что за ерунда?


 
easy ©   (2009-04-23 14:40) [1]

Она так и останется непонятной, пока не будет кода и полного текста сообщения об ошибке


 
Franzy   (2009-04-23 15:15) [2]

Кода там несколько тысяч строчек, вряд ли имеет смысл его приводить. Текст ошибки: Access Violation at address XXXXXXXXX in module "ntdll.dll". Read of address 00000000.

Меня просто удивляет, что при запуске из среды прога работает, а при запуске как ехе - нет. Трассирование ошибки с помощью лог-файла показало, что вылет имеет место быть при передаче управления вызываемой из длл функции обратно основной программе (сама функция выполянется успешно). Вот фрагмент:

function SendGridData : longint;
var
 ec1,ec2 : longint;
begin

 ec1 := G2DExportGrid(GridMap);
 // эта процедура записывает данные в memory-mapped file GridMap
 //процедура из длл, написанной на дельфи
 // выполняется успешно

 if ec1=0 then
   ec2 := FSReadGridData(GridMap,Length(GridMap))
  // эта команда считывает данные из файла выше
 //процедура из длл, написанной на фортране
   // выполняется успешно, судя по логу

 else
   ec2:=ec1;

 //А вот здесь вылетает - сообщение не выводится

showmessage("hello");

 if (ec1=0) and (ec2=0) then
  begin
    G2DFreeGridMap;
    G2DFreeMemory;
    Result:=0;
  end;

 Result:=ec2;
end;

//////////////
// А это кусок интерфейсной части проги, на всякий случай приведу:

function G2DExportGrid(const MapName: PAnsiChar): longint; stdcall; external "PKSGridder2d.dll";
procedure G2DFreeGridMap; stdcall; external "PKSGridder2d.dll";
procedure G2DFreeMemory; stdcall; external "PKSGridder2d.dll";

///////////////////////////////
function FSReadGridData(const mapname: PAnsiChar; len : longint): longint; stdcall; external "PKSSolver.dll" name "_FSREADGRIDDATA@8";


 
Rouse_ ©   (2009-04-23 16:00) [3]

Откуда вот такая строчка взялась?

> function FSReadGridData(const mapname: PAnsiChar; len :
> longint): longint; stdcall; external "PKSSolver.dll" name
> "_FSREADGRIDDATA@8";


 
Franzy   (2009-04-23 16:06) [4]

Это из интерфейсной части. FSReadGridData - это функция из длл на фортране. В этой строчке я ее объявляю и делаю доступной для основной проги. Если вас смущает _FSREADGRIDDATA@8, то это таким прикольным способом фортран обозначает точки входа в свои длл. 8 - это, кстати, кол-во байт в параметрах. В моем случае - пойнтер на строку и ее длина. Вряд ли проблема в этом, раньше без проблем работало.


 
Anatoly Podgoretsky ©   (2009-04-23 16:12) [5]

Насколько я знаю, обращение к Фортрану только через указатели, даже если данных один байт, но может что изменилось в последнее время.


 
Franzy   (2009-04-23 16:28) [6]

Так, ошибку локализовал. Что-то при чтении из MMF. При удалении этих строк ошибка перестает вылазить. Буду смотреть дальше.

Хотя до сих пор в непонятках, почему ошибка не вылазит, когда из среды запускаешь прогу...


 
Franzy   (2009-04-23 16:43) [7]

Все, нашел ошибку. Когда делал аллокейт памяти для дин. массива в фортране не тот размер передавал, из-за этого данные писались за конец массива... Теперь все нормально. Хотя до сих пор непонятно, почему на ехе ошибка вылазила, а из-под среды - нет.


 
Игорь Шевченко ©   (2009-04-23 18:51) [8]


> Хотя до сих пор в непонятках, почему ошибка не вылазит,
> когда из среды запускаешь прогу...


потому что из-под среды программа запускается в режиме отладки, а это накладывает свои ограничения


 
Германн ©   (2009-04-23 19:06) [9]

AV вообще противная штука в таком случае
> данные писались за конец массива

То она есть, то её нет :(


 
AlexDan ©   (2009-04-23 22:37) [10]

> Игорь Шевченко ©   (23.04.09 18:51) [8]
> потому что из-под среды программа запускается в режиме отладки,
>  а это накладывает свои ограничения
интересно услышать какие. у меня тоже раз такое было. отладка-нормально - ехе-нет. там правда речь шла об удалении рабочих файлов. но было б интересно услышать что за ограничения вообще..


 
Franzy   (2009-04-24 12:24) [11]

2Германн
AV?


 
Германн ©   (2009-04-24 21:59) [12]


> Franzy   (24.04.09 12:24) [11]
>
> 2Германн
> AV?
>

Угу. Именно AV.


 
Franzy   (2009-04-27 12:39) [13]

Я имел в виду, что это такое :)


 
@!!ex ©   (2009-05-01 09:58) [14]

> [10] AlexDan ©   (23.04.09 22:37)
> интересно услышать какие. у меня тоже раз такое было. отладка-
> нормально - ехе-нет. там правда речь шла об удалении рабочих
> файлов. но было б интересно услышать что за ограничения
> вообще..

Например, отладкич может выделять дополнительную память. ТОгда FV может и не возникать.



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

Текущий архив: 2009.06.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1241115142
AlexDan
2009-04-30 22:12
2009.06.21
Иконка к приложению..


15-1239357142
Kostafey
2009-04-10 13:52
2009.06.21
Посоветуйте почтовую программу


2-1241465604
ford
2009-05-04 23:33
2009.06.21
Ошибка при освобождении памяти выделенной переменной Pointer


11-1201782909
Elec3C
2008-01-31 15:35
2009.06.21
А баг всё равно есть


2-1240933165
@!!ex
2009-04-28 19:39
2009.06.21
ShortString в С++