| 
| 
 | Вопрос # 1 644/ вопрос открыт / | 
 |  Здравствуйте!
 Заранее прошу прощения, что вопрос про Билдер, но все-таки одно семейство ведь.
 Столкнулся с проблемой: имею С++Билдер6 и приложение. И вот это приложение работает нормально на процессорах Pentium, а на Селеронах отказывается, вылетает с access vioaltion. Не знаю что и делать. На АМДшных камнях проверить нет возможности. Настройки компилятора по части процессора прилагаю в картинке.
 Помогите плиз
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: Muratov Radik (статус: Посетитель)Вопрос отправлен: 2 июня 2008, 11:39
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 8; последнее сообщение — 9 июня 2008, 07:59; участников в обсуждении: 2. 
|   | Вадим К (статус: Академик), 2 июня 2008, 15:06 [#1]:окно настроек компилятора,приведённое вами ничем не поможет. скорее всего у вас проблема с кешем - это единственное место, где различаются Pentium и Селерон.
 
 Надо начать с того, что постепенно комментируя код, найти тот, который призводит к ошибке.
 
 Думаю, причина не в процессоре.
 
 Вы хотя бы код привели, который может вызывать исключения и/или хоть что делает (какие функции использует ваше приложение), а то получается вот у меня не работает, угадайте что.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 3 июня 2008, 09:43 [#2]:Думаете я не пытался отследить, ексепшн вылезает в самых неожиданных местах, даже при ShowMessage, а еще при Application->MessageBox. Всю программу не смогу наверное тут запостить
 |  
|   | Вадим К (статус: Академик), 3 июня 2008, 23:04 [#3]:Всю не надо постить. Хотя такое поведение похоже на "растрел памяти". Такое возникает при неудачной работе с указателями. Гадать на кофейной гуще я не умею.
 Ответье для начала хотя бы на такие вопросы:
 - есть ли ассемблерные вставки
 - используются ли потоки
 - используются ли сторонние библиотеки, если да, какие.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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 (статус: Посетитель), 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 (статус: Посетитель), 9 июня 2008, 07:59 [#8]:Вадим! Спасибо большое за помощь. Кажется я разобрался |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |