Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 644

/ вопрос открыт /

Здравствуйте!

Заранее прошу прощения, что вопрос про Билдер, но все-таки одно семейство ведь.
Столкнулся с проблемой: имею С++Билдер6 и приложение. И вот это приложение работает нормально на процессорах Pentium, а на Селеронах отказывается, вылетает с access vioaltion. Не знаю что и делать. На АМДшных камнях проверить нет возможности. Настройки компилятора по части процессора прилагаю в картинке.
Помогите плиз

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 2 июня 2008, 11:39
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 9 июня 2008, 07:59; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 2 июня 2008, 15:06 [#1]:

окно настроек компилятора,приведённое вами ничем не поможет.
скорее всего у вас проблема с кешем - это единственное место, где различаются Pentium и Селерон.

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

Думаю, причина не в процессоре.

Вы хотя бы код привели, который может вызывать исключения и/или хоть что делает (какие функции использует ваше приложение), а то получается вот у меня не работает, угадайте что.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 3 июня 2008, 09:43 [#2]:

Думаете я не пытался отследить, ексепшн вылезает в самых неожиданных местах, даже при ShowMessage, а еще при
Application->MessageBox. Всю программу не смогу наверное тут запостить
Вадим К

Вадим К (статус: Академик), 3 июня 2008, 23:04 [#3]:

Всю не надо постить. Хотя такое поведение похоже на "растрел памяти". Такое возникает при неудачной работе с указателями.
Гадать на кофейной гуще я не умею.
Ответье для начала хотя бы на такие вопросы:
- есть ли ассемблерные вставки
- используются ли потоки
- используются ли сторонние библиотеки, если да, какие.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 4 июня 2008, 07:59 [#4]:

Ассемблерных вставок нет.
потоки да используются(один)
используется библиотека USBLibrary.lib
вот ее h-файл:
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the USBLIBRAIRIE_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// USBLIBRAIRIE_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef USBLIBRARY_EXPORTS
#define USBLIBRARY_API __declspec(dllexport)
#else
#define USBLIBRARY_API __declspec(dllimport)
#endif

//////////////////////////////////////////////////////////////

#include <windows.h>
#include <setupapi.h>
#include <basetyps.h>


class USBLIBRARY_API CFCPipeUSB {

HANDLE m_hPipeIn; // Handel of the input file
HANDLE m_hPipeOut; // Handel of the output file

public :
CFCPipeUSB(); // Constructor

short Open(char *sDeviceName); // Open pipe
short Close(); // Close pipe

virtual short ReadPipe(LPVOID pBuffer, ULONG ulBufferSize); // Read data
virtual short WritePipe(LPVOID pBuffer, ULONG ulBufferSize, ULONG *pBytesWritten); // Write data
};

// Get list of connected device
USBLIBRARY_API int GetUsbDeviceListName(char** deviceList[]);

#define FC_OK 0 //OK

//ERROR
#define FC_ERROR_MASK (short)(0x8000)
#define FC_CODE_MASK (short)(0x7fff)

//Critical Errors
#define FC_ERROR (short)(0x8000) //Internal error
#define FC_DLL_NOT_INITIALIZED (short)(0x8001)
#define FC_NOT_OPEN (short)(0x8002) //Device not opened
#define FC_DRIVER_NOT_FOUND (short)(0x8004) //driver may not be installed
#define FC_DEVICE_NOT_CONNECTED (short)(0x8008) //Device may be not connected
#define FC_DRIVER_ERROR (short)(0x8010) //Error during driver acquisition
//or device not plugged
#define FC_BUSY (short)(0x8020) //device busy
#define FC_NOT_ENOUGH_MEMORY (short)(0x8040) //can't allocate memory
#define FC_NOT_INITIALIZED (short)(0x8080) //parameter not initialized
#define FC_NO_SLICE_MEMORY (short)(0x8100) //no slice memory
#define FC_NO_IMAGE_MEMORY (short)(0x8200) //no image memory

#define FC_SYNCHRO_LOST (short)(0x9001) //synchro bytes lost
#define FC_WRONG_SIZE_SLICE (short)(0x9002) //wrong slice size
#ifdef WIN32
#define FC_WRONG_IMAGE_WIDTH (short)(0x9004)
#endif

#define FC_NO_BANDWIDTH (short)(0xA001) //No bandwidth allocated for usb driver

#define FC_OPERATION_ABORTED (short)(0xC000) //Operation was aborted

//Not Critical Errors
#define FC_BAD_FINGER (short)(0xD001) //finger not swept fine
#define FC_IMAGE_TOO_BIG (short)(0xD002) //image buffer too big
#define FC_IMAGE_TOO_SMALL (short)(0xD004) //image is too small
#define FC_HEIGHT_TOO_LITTLE (short)(0xD008) //Image height to little
#define FC_TOO_SLOW (short)(0xD010) //sweeping was too slow
#define FC_TOO_FAST (short)(0xD020) //sweeping was too fast
#define FC_NOT_ENOUGH_GOOD_SLICE (short)(0xD040)//not enough good slices
#define FC_TIME_OUT (short)(0xD080) //timeOut
#define FC_NOT_SUPPORTED (short)(0xD100) //Parameter or function not
//supported by the current device

//WARNING
#define FC_DIRECTORY_MISSING (short)(0x0001) //directory is missing
#define FC_UNABLE_OPEN_FILE (short)(0x0002) //can't open the file
#define FC_UNCONSISTENT_SLICE (short)(0x0004) //Slices are not consistent
#define FC_NO_THERMAL (short)(0x0008) //Chip warming does not work
#define FC_THRESHOLD_HIGH (short)(0x0010) //Finger detection threshold to high
#define FC_HALF_BANDWIDTH (short)(0x0020) //only half bandwidth allocated for usb driver
#define FC_TEMPERATURE_NOT_UPTODATE (short)(0x0040) //Temperature is not uptodate
#define FC_TOO_WARM (short)(0x0080) //Temperature too high to warm
#define FC_TOO_COLD (short)(0x0090) //Temperature too low to warm
#define FC_SLOW (short)(0x0900) //Sweeping was a bit slow
#define FC_IMAGE_TRUNCATED (short)(0x0300) //reconstructed image was truncated
#define FC_NO_FINGER (short)(0x2000) //No finger detected
#define FC_TRUNCATED_MESSAGE (short)(0x4000) //Error message was truncated

еще используется guid829.h:
/*++

Copyright (c) 1997-1998 Microsoft Corporation

Module Name:

GUID829.h

Abstract:

The below GUID is used to generate symbolic links to
driver instances created from user mode

Environment:

Kernel & user mode

Notes:

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.

Copyright (c) 1997-1998 Microsoft Corporation. All Rights Reserved.

Revision History:

11/18/97 : created

--*/
#ifndef GUID829H_INC
#define GUID829H_INC

#include <initguid.h>


// {E6EF7DCD-1795-4a08-9FBF-AA78423C26F0}
DEFINE_GUID(GUID_CLASS_I82930_BULK,
0xe6ef7dcd, 0x1795, 0x4a08, 0x9f, 0xbf, 0xaa, 0x78, 0x42, 0x3c, 0x26, 0xf0);


#endif // end, #ifndef GUID829H_INC
Вадим К

Вадим К (статус: Академик), 5 июня 2008, 09:54 [#5]:

приводить сами хедеры бессмысленно.
Точно ошибка где то при работе с памятью.
Скорее всего так. Вы выделяте память, а потом обращаетесь к ней, но чуть "выходите за пределы". буквально на байт-второй. Если правильно подобрать, то будет воспроизводиться ваша проблема
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 5 июня 2008, 15:42 [#6]:

Я включил CodeGuard и он указал мне на утечку памяти в этой функции:

bool TMainForm::GetDeviceName (HDEVINFO HardwareDeviceInfo,
PSP_INTERFACE_DEVICE_DATA DeviceInfoData,
char **pDevName)
{
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
ULONG predictedLength = 0;
ULONG requiredLength = 0;
HANDLE hOut = INVALID_HANDLE_VALUE;
HDEVINFO hardwareDeviceInfo;
ULONG tmpUL = 0;
char *sPipeNameOut;
int i;
//
// allocate a function class device data structure to receive the
// goods about this particular device.
//
SetupDiGetInterfaceDeviceDetail(HardwareDeviceInfo,
DeviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL); // not interested in the specific dev-node

predictedLength = requiredLength;

functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);

tmpUL = sizeof(functionClassDeviceData)*sizeof(PSP_INTERFACE_DEVICE_DETAIL_DATA);
//
// Retrieve the information from Plug and Play.
//
if (!SetupDiGetInterfaceDeviceDetail(HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL))
{
free(functionClassDeviceData);
return FALSE;
}

*pDevName = strdup(functionClassDeviceData->DevicePath);
// free(functionClassDeviceData);
// SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
/* ::strcpy(sPipeNameOut, *pDevName);
::strcat(sPipeNameOut, "\\PIPE00"); */
strcat(functionClassDeviceData->DevicePath, "\\PIPE00");

m_hPipeOut = ::CreateFile(functionClassDeviceData->DevicePath,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
// free(functionClassDeviceData);

if (!SetupDiGetInterfaceDeviceDetail(HardwareDeviceInfo,
DeviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL))
{
free(functionClassDeviceData);
return FALSE;
}
strcat(functionClassDeviceData->DevicePath, "\\PIPE01");

m_hPipeIn = ::CreateFile(functionClassDeviceData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);

if((m_hPipeIn == INVALID_HANDLE_VALUE)
|| (m_hPipeOut == INVALID_HANDLE_VALUE))
{
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),//LastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,0,NULL))
MessageBox( NULL,(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONSTOP ); LocalFree( lpMsgBuf );
}

//free(functionClassDeviceData);

return true;
}

Он говорит, что память выделенная под functionClassDeviceData никогда не освобождается, но когда я пытаюсь при выходе из функции ее освободить free(functionClassDeviceData), то все равно вылезает access violation.
Никак не пойму в чем дело :( может Вы подскажете?
Вадим К

Вадим К (статус: Академик), 7 июня 2008, 17:48 [#7]:

Первое, что смущает, это строки
  *pDevName = strdup(functionClassDeviceData->DevicePath);
........
  strcat(functionClassDeviceData->DevicePath, "\\PIPE00");
Постают резонные вопросы
- достаточно ли в pDevName места для строки.
- достаточно ли места в functionClassDeviceData->DevicePath - я не увидел выделения памяти под эту строку.
Подобных моментов много по коду. Это типичная ошибка с выделением памяти. Память при определённых условиях может использоваться без выделения.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 9 июня 2008, 07:59 [#8]:

Вадим! Спасибо большое за помощь. Кажется я разобрался

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.03 сек.