Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Franzy ©   (2009-04-23 14:35:00) 

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


@!!ex   (2009-05-01 09:58:00) [1]

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

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


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

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


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


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

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


Franzy   (2009-04-24 12:24:00) [4]

2Германн
AV?


AlexDan   (2009-04-23 22:37:00) [5]

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


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

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

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


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


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


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


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

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


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

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

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


Anatoly Podgoretsky   (2009-04-23 16:12:00) [10]

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


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

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


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

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

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


Franzy   (2009-04-23 15:15:00) [13]

Кода там несколько тысяч строчек, вряд ли имеет смысл его приводить. Текст ошибки: 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';


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо