Вот пишу видео декодер с использованием ускорения на видео картах NVidia c CUDA технологией.
Но возникла проблемка, в Visual Studio (я новичок в студии) прога вылетает с ошибкой доступа к памяти в этом участке кода:
Помогите, как определить точку вилета в студии?
C++ (Qt)
void VideoDecoder::parsePacket(AVPacket *pPacket,CUvideoparser *pParser,CUvideoctxlock pCtx){
//
// CUresult CUDAAPI cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket);
//typedef struct _CUVIDSOURCEDATAPACKET
//{
// unsigned long flags; // Combination of CUVID_PKT_XXX flags
// unsigned long payload_size; // number of bytes in the payload (may be zero if EOS flag is set)
// const unsigned char *payload; // Pointer to packet payload data (may be NULL if EOS flag is set)
// CUvideotimestamp timestamp; // Presentation timestamp (10MHz clock), only valid if CUVID_PKT_TIMESTAMP flag is set
//} CUVIDSOURCEDATAPACKET;
CUresult cu_result;
CUdeviceptr cu_memory;
//cu_result=cuMemAlloc(&cu_memory,(size_t)pPacket->size);
//if(cu_result!=CUDA_SUCCESS){printf("==>CUDA: cuMemAlloc(...) error!, code: %d\n",cu_result);exit(-1);}
//cu_result=cuMemcpyHtoD(cu_memory,pPacket->data,(size_t)pPacket->size);
//if(cu_result!=CUDA_SUCCESS){printf("==>CUDA: cuMemcpyHtoD(...) error!, code: %d\n",cu_result);exit(-1);}
CUVIDSOURCEDATAPACKET *cu_packet=new CUVIDSOURCEDATAPACKET;
memset(cu_packet,0,sizeof(CUVIDSOURCEDATAPACKET));
cu_packet->flags=CUVID_PKT_TIMESTAMP;
cu_packet->payload_size=pPacket->size;
cu_packet->payload=pPacket->data;//(unsigned char*)cu_memory;//
cu_packet->timestamp=0;
printf("CUDA: before cuvidParseVideoData(...)\n, ");
//uint8_t *tmp={0};
//memset(tmp,0,pPacket->size);
//memcpy((void *)cu_packet->payload,pPacket->data,pPacket->size);
//memcpy(tmp,pPacket->data,(size_t)pPacket->size);
//memcpy((uint8_t*)cu_packet.payload, pPacket->data,pPacket->size);
//cuvidCtxLock(pCtx,0);
cu_result=cuvidParseVideoData(pParser,cu_packet);
if(cu_result!=CUDA_SUCCESS){printf("==>CUDA: Can't parse packet!, code: %d\n");exit(-1);}
printf("CUDA: after cuvidParseVideoData(...)\n");
//cuvidCtxUnlock(pCtx,0);
}//parsePacket
Ставим точку остановки (insert breakpoint) в начале функции и потом нажимая F10 (шаг вперед) и F11 (шаг внутрь) проходим всю функцию. На какой строке вылет - повторяем процесс, нажимая на той строке F11. И так далее.
PS т.е. F10 идёт к следующей команде в данной функции. А F11 заходит в вызванную функцию.