8516|14

80

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

CloseHandle()释放句柄出错! [复制链接]

我最近在调试摄像头,在测试程序里面调用摄像头:

  1. // Open an instance of camera driver
  2. hCamDrv = CreateFile( CAMERA_INTERFACE, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
复制代码


拍照,录像等操作都正常。

最后,

  1. CleanUp:

  2. RETAILMSG(1,(L"IOCTL_CAM_RSC_RELEASE\n"));
  3. //Sleep(20000);

  4. // Release access to Camera
  5. if ( !DeviceIoControl(hCamDrv, IOCTL_CAM_RSC_RELEASE, NULL, 0, NULL, 0, &dwBytes, NULL) )
  6. {
  7.     RETAILMSG(CAMTEST_ERR,(L"[CAMTEST:ERROR] IOCTL_CAM_RSC_REQUEST Failed\n"));
  8. }

  9. RETAILMSG(1,(L"CloseHandle(hCamDrv)\n"));
  10. //Sleep(20000);

  11. CloseHandle(hCamDrv);

  12. RETAILMSG(1,(L"Return...\n"));
复制代码


发现CloseHandle(hCamDrv)这里就崩溃了。
如果把这里注释掉,程序可以正常结束。

崩溃信息:

IOCTL_CAM_RSC_RELEASE
CloseHandle(hCamDrv)

Exception 'Data Abort' (4): Thread-Id=0633000e(pth=849be390), Proc-Id=0632000e(pprc=849be270) 'cameraif_test.exe', VM-active=0632000e(pprc=849be270) 'cameraif_test.exe'
PC=80118df0(kernel.dll+0x00007df0) RA=80118eec(kernel.dll+0x00007eec) SP=d724fc80, BVA=0002ff08
Exception 'Data Abort' (4): Thread-Id=0633000e(pth=849be390), Proc-Id=0632000e(pprc=849be270) 'cameraif_test.exe', VM-active=0632000e(pprc=849be270) 'cameraif_test.exe'
PC=8011819c(kernel.dll+0x0000719c) RA=00000001(???+0x00000001) SP=d724f870, BVA=0002fefc
Exception 'Data Abort' (4): Thread-Id=0633000e(pth=849be390), Proc-Id=0632000e(pprc=849be270) 'cameraif_test.exe', VM-active=0632000e(pprc=849be270) 'cameraif_test.exe'
PC=801189c0(kernel.dll+0x000079c0) RA=fffff000(???+0xfffff000) SP=d724f890, BVA=0002fefc
Exception 'Raised Exception'(-1) Thread-Id=0633000e(pth=849be390) PC=801189c0 BVA=00000000
R0=d724f804  R1=d724f750  R2=c0082810  R3=d724f8c8
R4=00000001  R5=d724f8c8  R6=c00828c0  R7=00000008
R8=00000001  R9=80118ba4 R10=d724f734 R11=c0082c14
R12=80118df0  SP=d724f890  Lr=051fc000 Psr=6000001f

.....
下面不停打印:

Exception 'Data Abort' (4): Thread-Id=00570002(pth=8ffd7978), Proc-Id=00400002(pprc=82789308) 'NK.EXE', VM-active=043a000a(pprc=8efc9b68) 'explorer.exe'
PC=8012cc64(kernel.dll+0x0001bc64) RA=8012cc40(kernel.dll+0x0001bc40) SP=ffffc7ac, BVA=00000004
Exception 'Data Abort' (4): Thread-Id=057b0006(pth=8f3235ac), Proc-Id=00400002(pprc=82789308) 'NK.EXE', VM-active=00400002(pprc=82789308) 'NK.EXE'
PC=c0191010(gwes.dll+0x00051010) RA=c0190f88(gwes.dll+0x00050f88) SP=d5acfe5c, BVA=000000ac
Exception 'Prefetch Abort' (3): Thread-Id=057b0006(pth=8f3235ac), Proc-Id=043a000a(pprc=8efc9b68) 'explorer.exe', VM-active=043a000a(pprc=8efc9b68) 'explorer.exe'
PC=000313d4(explorer.exe+0x000213d4) RA=f101fffc(???+0xf101fffc) SP=0040fe70, BVA=000313d4
Exception 'Prefetch Abort' (3): Thread-Id=057b0006(pth=8f3235ac), Proc-Id=043a000a(pprc=8efc9b68) 'explorer.exe', VM-active=043a000a(pprc=8efc9b68) 'explorer.exe'
PC=40053928(coredll.dll+0x00043928) RA=80117bbc(kernel.dll+0x00006bbc) SP=0040fd2c, BVA=40053928
Exception 'Prefetch Abort' (3): Thread-Id=057b0006(pth=8f3235ac), Proc-Id=043a000a(pprc=8efc9b68) 'explorer.exe', VM-active=043a000a(pprc=8efc9b68) 'explorer.exe'
PC=40053928(coredll.dll+0x00043928) RA=80117bbc(kernel.dll+0x00006bbc) SP=0040fbe8, BVA=40053928
Exception 'Prefetch Abort' (3): Thread-Id=057b0006(pth=8f3235ac), Proc-Id=043a000a(pprc=8efc9b68) 'explorer.exe', VM-active=043a000a(pprc=8efc9b68) 'explorer.exe'

各位兄弟有知道什么原因的么?

最新回复

IST Thread都已经停掉了,不知道什么原因啊。 郁闷~~~  详情 回复 发表于 2010-3-19 16:56
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
是否有些线程在CloseHandle之后又在通过DeviceIoControl等访问hCamDrv?
看上去很像啊
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
// Release access to Camera
if ( !DeviceIoControl(hCamDrv, IOCTL_CAM_RSC_RELEASE, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
    RETAILMSG(CAMTEST_ERR,(L"[CAMTEST:ERROR] IOCTL_CAM_RSC_REQUEST Failed\n"));
}

这个IOControl是在CloseHandle之前执行的,但是奇怪的是,在驱动内部执行这条IOControl时打印的输出信息会在CloseHandle后面打印出来。

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看是否有内存访问越界
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 lbqhope 的回复:
// Release access to Camera
if ( !DeviceIoControl(hCamDrv, IOCTL_CAM_RSC_RELEASE, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(CAMTEST_ERR,(L"[CAMTEST:ERROR] IOCTL_CAM_RSC_REQUEST Failed\n")……


IOCTL_CAM_RSC_RELEASE
[RAWCAM] CAM_IOControl(pOpenHead=0xd7370600, dwCode=0x00042074)
+CAM_IOControl(pOpenHead=0xD7370600, dwCode=0x42074, pBufIn=0x0, dwLenIn=0, pBufOut=0x0, dwLenOut=0, pdwActualOut=0x2FD88)

CloseHandle(hCamDrv=0xD736FE60)

[RAWCAM] +++CAM_Close(pOpenHead=0xd7370600)
  CAM_Close: ( pCAMHead->OpenCnt = 0)
  -->Ready to call HWClose
  -->Returned from HWClose
[RAWCAM] ---CAM_Close

Exception 'Data Abort' (4): Thread-Id=07ba000a(pth=849c142c), Proc-Id=07b6000a(pprc=849c130c) 'cameraif_test.exe', VM-active=07b6000a(pprc=849c130c) 'cameraif_test.exe'
PC=80118df0(kernel.dll+0x00007df0) RA=80118eec(kernel.dll+0x00007eec) SP=d736fc80, BVA=0002ff08
Exception 'Data Abort' (4): Thread-Id=07ba000a(pth=849c142c), Proc-Id=07b6000a(pprc=849c130c) 'cameraif_test.exe', VM-active=07b6000a(pprc=849c130c) 'cameraif_test.exe'
PC=8011819c(kernel.dll+0x0000719c) RA=00000001(???+0x00000001) SP=d736f870, BVA=0002fefc
Exception 'Data Abort' (4): Thread-Id=07ba000a(pth=849c142c), Proc-Id=07b6000a(pprc=849c130c) 'cameraif_test.exe', VM-active=07b6000a(pprc=849c130c) 'cameraif_test.exe'
PC=801189c0(kernel.dll+0x000079c0) RA=fffff000(???+0xfffff000) SP=d736f890, BVA=0002fefc
Exception 'Raised Exception'(-1) Thread-Id=07ba000a(pth=849c142c) PC=801189c0 BVA=00000000
R0=d736f804  R1=d736f750  R2=c0082810  R3=d736f8c8
R4=00000001  R5=d736f8c8  R6=c00828c0  R7=00000008
R8=00000001  R9=80118ba4 R10=d736f734 R11=c0082c14
R12=80118df0  SP=d736f890  Lr=051fc000 Psr=6000001f

就是这种状况。
[RAWCAM] +++CAM_Close(pOpenHead=0xd7370600)
  CAM_Close: ( pCAMHead->OpenCnt = 0)
  -->Ready to call HWClose
  -->Returned from HWClose
[RAWCAM] ---CAM_Close
这些输出应该是在
[RAWCAM] CAM_IOControl(pOpenHead=0xd7370600, dwCode=0x00042074)
+CAM_IOControl(pOpenHead=0xD7370600, dwCode=0x42074, pBufIn=0x0, dwLenIn=0, pBufOut=0x0, dwLenOut=0, pdwActualOut=0x2FD88)
这里面输出的。但是却跑到CloseHandle(hCamDrv=0xD736FE60)后面去了。

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 91program 的回复:
看看是否有内存访问越界


别的操作都没问题啊,只是释放这个Handle有问题。
从CloseHandle的作用来看,只是告诉系统该Handle我不在使用了,引用计数减一而已啊。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 veabol 的回复:
是否有些线程在CloseHandle之后又在通过DeviceIoControl等访问hCamDrv?
看上去很像啊


我觉得也是,不过想不出来会有什么问题。
IOCTL_CAM_RSC_RELEASE没有执行完毕是不会返回的吧。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
CloseHandle()通过系统会调用驱动中的CAM_Close(),
所以CAM_Close()中的打印信息在CloseHandle(hCamDrv)后显示没有问题
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 

  1. void CusCam_DeinitializeBuffer(UINT32 uCamID)
  2. {
  3.     CUSCAM_MSG((_T("[CUSCAM] ++%s(uCamID=%d)\r\n"), _T(__FUNCTION__), uCamID));

  4.     if(oCtxCamera[uCamID].pCodecVirtAddr != NULL)
  5.     {
  6.         MmUnmapIoSpace(oCtxCamera[uCamID].pCodecVirtAddr, CAPTURE_BUFFER_SIZE);
  7.         oCtxCamera[uCamID].pCodecVirtAddr = NULL;
  8.     }
  9.    
  10.         if(oCtxCamera[uCamID].pPreviewVirtAddr != NULL)
  11.     {
  12.         MmUnmapIoSpace(oCtxCamera[uCamID].pPreviewVirtAddr, PREVIEW_BUFFER_SIZE);   
  13.         oCtxCamera[uCamID].pPreviewVirtAddr = NULL;
  14.     }

  15.     CUSCAM_MSG((_T("[CUSCAM] --%s()\r\n"),_T(__FUNCTION__)));
  16. }
复制代码


问题出现在这里,CUSCAM_MSG((_T("[CUSCAM] --%s()\r\n"),_T(__FUNCTION__)));
没打印出来就挂了,看样子是内存释放后有线程试图使用产生的???
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
你不释放这些内存看看还会不会有错了
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
释放有问题,可能是因为中间的操作导致Handle值被修改或覆盖
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
返回Handle是底层驱动的数据结构的地址。建议跟踪下以这个Handle为地址的内存空间,有可能是驱动的问题。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 91program 的回复:
释放有问题,可能是因为中间的操作导致Handle值被修改或覆盖


查看过了,Handle的值没有改变
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 9 楼 veabol 的回复:
你不释放这些内存看看还会不会有错了


if(oCtxCamera[uCamID].pCodecVirtAddr != NULL)
{
    MmUnmapIoSpace(oCtxCamera[uCamID].pCodecVirtAddr, CAPTURE_BUFFER_SIZE);
    oCtxCamera[uCamID].pCodecVirtAddr = NULL;
}

释放Codec的内存就出错,释放Preview的没关系。
因为我的测试程序没有打开Preview,只使用了Codec内存。看来问题还是在这里。
有线程还在使用这块内存。我再查查
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

15
 
IST Thread都已经停掉了,不知道什么原因啊。
郁闷~~~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表