Функции Intel MKL, вызывающие TerminateProcess () внутри

Я пытаюсь использовать некоторые функции из Библиотека Intel MKL, в программе, написанной на Embarcadero C ++ Builder 2010. Я сталкиваюсь с каким-то странным поведением, когда вызов любого из методов MKL молча завершает приложение. Оказывается, библиотека звонит TerminateProcess() когда любой метод вызывается. У меня возникли некоторые проблемы с поиском точно, где заканчивается приложение, потому что вход в метод MKL и инструкция трассировки по инструкции в представлении ЦП вызывает в TerminateProcess метод в разных местах каждый раз.

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

Что может вызвать это? Кто-нибудь успешно использовал MKL с программой C ++ Builder?

симптомы

У меня есть следующий код, основанный на Двумерное БПФ (C интерфейс) пример:

DFTI_DESCRIPTOR_HANDLE hDesc;
MKL_LONG alDimensions[2];
alDimensions[0] = 32; // Array dimensions
alDimensions[1] = 100;
MKL_LONG lStatus = DftiCreateDescriptor(&hDesc, DFTI_SINGLE, DFTI_COMPLEX, 2, alDimensions);

Программа, казалось, пропала без вести отладчиком при вызове в DftiCreateDescriptor, Итак, чтобы исследовать, я вошел в функцию и прошел через сборку. Это прыгает к MKL_RT.DftiCreateDescriptor_s_md, а затем я могу пролистать десять или более страниц сборки. В какой-то момент это будет call адрес, который оказывается TerminateProcess, Однако точка, в которой это происходит, кажется случайной. В какой-то момент, например, я сузил его до одного оператора вызова и адреса, только чтобы он потерпел крах до того, как попал в следующий раз, когда запустил программу. Редактировать: Поскольку я впервые задал этот вопрос, я установил контрольные точки на ExitProcess, TerminateProcess, TerminateThreadи т. д., и обнаружил, что он звонит TerminateProcess, (Первоначально я не знал, почему это молча закончилось.) Точка, в которой это происходит, все еще меняется. Нет полезного стека вызовов (это тестовая программа, источник ниже):

:7540d79a kernel32.TerminateProcess
:5be911c9 ; C:\projects\mkl crash\Debug\MKL_RT.DLL
:5be837bd ; C:\projects\mkl crash\Debug\MKL_RT.DLL
:004013C5 main(argc=1, argv=:008B9908)
:32ad2342 ; C:\Windows\SysWOW64\CC32100.DLL

(Эти две строки MKL_RT.dll при рассмотрении в представлении ЦП, похоже, не в правильных методах. Скорее всего, это потому, что это код выпуска и отладчик не отслеживает стек вызовов должным образом … или может быть связано с проблемой.)

Я воспроизвел это с несколькими другими методами MKL тоже. С использованием Интерфейс совместимости FFTW3, иногда происходит вызов fftwf_malloc (а иногда нет) и всегда происходит при звонке fftwf_plan_dft_2d,

Подробнее

  • Я использую последнюю версию, 2013 SP1. Я установил только компоненты IA32 (поскольку CB2010 является 32-битным компилятором).
  • Я связываюсь с опция связывания с одной DLL, ссылка на mkl_rt.dll,
  • Однако, поскольку mkl_rt.lib является файлом COFF, я сгенерировал новый .lib, используя implib -a mkl_rt.lib mkl_rt.dll, Он создал, по-видимому, прекрасную библиотеку, хотя предупреждал о сотнях дублирующих символов.
  • Комментатор великий волк ниже предложил другой implib команда, implib -a -c mkl_rt.lib mkl_rt.dll, чтобы сохранить регистр имени метода. Это вызвало гораздо меньшее количество повторяющихся предупреждений об именах, но не связывает: [ILINK32 Error] Fatal: Exceeded memory limit for block Import symbols in module _vsrnggumbel
  • Я также попытался загрузить библиотеку и функции динамически, на случай, если возникла проблема с файлом .lib, прототипами методов и т. Д. (Например, загрузка и прямой вызов DftiCreateDescriptor_s_md из DLL.) Поведение остается неизменным.
  • Интерфейс C для DLL использует cdecl соглашение о вызовах, это то, что параметры проекта установлены по умолчанию для использования, и входя в код вызова для метода, я вижу все параметры, помещаемые в стек. Кажется, что каждая функция вызывается правильно.
  • Изменение моего динамически загруженного прототипа на stdcall (хотя это должен находить cdecl версия) вызвала ту же проблему — но это стоило проверить. DLL, mkl_rt.dll, поддерживает в основном только cdecl версии.
  • IDE не настроен на игнорирование каких-либо исключений. В разделе «Инструменты»> «Параметры»> «Параметры отладчика»> «Отладчики Embarcadero»> «Исключения собственной операционной системы» все исключения устанавливаются для обработки отладчиком.

Размножение

Вот простая программа C для командной строки, которой достаточно, чтобы продемонстрировать сбой:

#include <stdio.h>
#pragma hdrstop

#include <tchar.h>
// Intel MLK
#include "mkl/include/mkl.h"#pragma comment(lib, "mkl/mkl_rt.lib") // Generated with implib

int _tmain(int argc, _TCHAR* argv[]) {
DFTI_DESCRIPTOR_HANDLE hDesc;
MKL_LONG lStatus;
MKL_LONG alDimensions[2];
alDimensions[0] = 32;
alDimensions[1] = 100;
lStatus = DftiCreateDescriptor(&hDesc, DFTI_SINGLE, DFTI_COMPLEX, 2, alDimensions);

// Here, you would normal declare your arrays (32x100) of _Complex, and call DftiCommitDescriptor,
// DftiComputeForward, DftiFreeDescriptor - but it will have already terminated
// on the line above.

return 0;
}

Командная строка BCB, в которой IDE создает это:

c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ bin \ bcc32.exe
-D_DEBUG -D_RTLDLL; _NO_VCL -I «…» -y -Q -k -k-r-c -tWC -C8 -oDebug \ mkltest.obj -w-par -Od -v -vi- -H = Отладка \ MKLTest.pch -H mkltest.c

и ссылки:

c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ bin \ ilink32.exe
-LDebug; «…»; «…» -lDebug -v -G8 c0x32 Debug \ mkltest.obj, Debug \ MKLTest.exe, Debug \ MKLTest.map, import32.lib cw32i.lib,,

Где я пропустил огромное количество включаемых путей. Для той же полноты, все строки:

c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ bin \ bcc32.exe
-D_DEBUG -D_RTLDLL; _NO_VCL -I «C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ Cbuilder14 «; C: \ проекты \ Misc \ DirectX \ Direct3D \ Tutorials \ Tut05_Textures;» C: \ Program
Файлы (x86) \ Embarcadero \ RAD
Studio \ 7.0 \ include \ boost_1_39 \ boost \ tr1 \ tr1 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include \ dinkumware «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include \ vcl «;» C: \ Program Files
(x86) \ Embarcadero \ RAD Studio \ 7.0 \ include \ boost_1_39 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include \ vcl «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ ObjRepos \ Cpp «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ include \ Indy10 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ Virtual Treeview \ Common «;» c: \ program
файлы (x86) \ embarcadero \ rad studio \ 7.0 \ Virtual
Treeview \ Source «;» c: \ program files (x86) \ embarcadero \ rad
studio \ 7.0 \ Virtual Treeview \ Delphi «;» c: \ программные файлы
(x86) \ embarcadero \ rad studio \ 7.0 \ include \ boost_1_39 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ Toolbar2000 \ TB2K \ Lib \ D12 «;» c: \ program
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ Toolbar2000 \ SpTBXLib \ Source «;» c: \ программные файлы
(X86) \ Embarcadero \ радиан
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» C: \ Program Files (x86) \ TMS Advanced Poly
List \ Builder2010 «;» C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ CBuilder14 «;» c: \ program files (x86) \ embarcadero \ rad
studio \ 7.0 \ Abbrevia \ source «-y -Q -k -r- -c -tWC -C8
-oDebug \ mkltest.obj -w-par -Od -v -vi- -H = Отладка \ MKLTest.pch -H mkltest.c

и ссылки:

c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ bin \ ilink32.exe
-LDebug; «c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ lib \ debug»; «C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ Cbuilder14 «; C: \ проекты \ Misc \ DirectX \ Direct3D \ Tutorials \ Tut05_Textures;» C: \ Program
files (x86) \ embarcadero \ rad studio \ 7.0 \ lib «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ obj «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ psdk «;» C: \ Program Files
(x86) \ EurekaLab \ EurekaLog 6 \ CBuilder14 «;» c: \ программные файлы
(x86) \ embarcadero \ rad studio \ 7.0 \ lib «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ psdk «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ Indy10 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ Toolbar2000 \ TB2K \ Lib \ D12 «;» c: \ program
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» C: \ Program Files (x86) \ TMS Advanced Poly
List \ Builder2010 «;» C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ CBuilder14 «;» C: \ Users \ Public \ Documents \ RAD Studio \ 7.0 \ DCP «-jDebug;» c: \ program files (x86) \ embarcadero \ rad studio \ 7.0 \ lib \ debug «;» C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ Cbuilder14 «; C: \ проекты \ Misc \ DirectX \ Direct3D \ Tutorials \ Tut05_Textures;» C: \ Program
files (x86) \ embarcadero \ rad studio \ 7.0 \ lib «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ obj «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ psdk «;» C: \ Program Files
(x86) \ EurekaLab \ EurekaLog 6 \ CBuilder14 «;» c: \ программные файлы
(x86) \ embarcadero \ rad studio \ 7.0 \ lib «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ psdk «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ lib \ Indy10 «;» c: \ program files
(x86) \ embarcadero \ rad studio \ 7.0 \ Toolbar2000 \ TB2K \ Lib \ D12 «;» c: \ program
файлы (x86) \ embarcadero \ rad
studio \ 7.0 \ AutomatedQADocking \ Source «;» C: \ Program Files (x86) \ TMS
Расширенный список поли «;» C: \ Program Files (x86) \ TMS Advanced Poly
List \ Builder2010 «;» C: \ Program Files (x86) \ EurekaLab \ EurekaLog
6 \ CBuilder14 «;» C: \ Users \ Public \ Documents \ RAD Studio \ 7.0 \ DCP «-lDebug
-v -G8 c0x32 Debug \ mkltest.obj, Debug \ MKLTest.exe, Debug \ MKLTest.map, import32.lib cw32i.lib,,

Последнее замечание: я только что добавил тег [delphi], так как он использует тот же RTL, если это связано. Я использую RAD Studio 2010, которая включает в себя C ++ Builder и Delphi. Основное приложение, в которое я помещаю MKL, написано на обоих языках. Тестовое приложение выше — чистый C.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …