各位好,
情况是这样的,一个MFC程序,一个线程从文件中读取数据,加入到队列中,另一个线程从队列中读取数据,根据某些字段到数据库oracal11g中查询结果,然后写入另外一个文件中。本机使用的oracle客户端是9i的。
一台电脑上开了两个程序在一起跑。
两个程序平时可以从数据库中查询到正确结果,并写入文件中。说明使用这个oracle客户端可以正确连接,查询。工作很正常。但现在出现了一个问题,进程有时候就莫名其妙地没有了。没有任何提示框,不像是异常没有捕捉,也不是空指针那种退出。操作系统(2003)日志也没有任何记录。它就是凭空消失了。出现这种情况的时间不一定,有时候隔一天,有时候隔五六天。只捕捉到一次DMP文件。两次没产生。下面是DMP文件查看栈时的情况。0:002> kb
ChildEBP RetAddr  Args to Child              
0191b984 60535473 0208d2ac 0208eef4 00000000 0x0
WARNING: Stack unwind information not available. Following frames may be wrong.
0191c1cc 6149387d 0208eef4 00000000 0208eef4 oracommon9!ttcdrv+0x1fb3
0191c1e4 606e550e 0208d350 00000000 607323c2 oran9!nioqwa+0x2d
0191de8c 606a568d 0008d2ac 0000004e 0208ee28 OraClient9!xaolog+0x2ef6e
0191dec0 60693e57 0208d2ac 0000004e 0208ee28 OraClient9!upirtr+0xbd
0191defc 606747d0 0208cc00 0000004e 0208ee28 OraClient9!kpurcs+0x97
0191fbc4 60675a20 0208cc00 0211690c 0208ff34 OraClient9!kpuexInitStmh+0x1a10
0191fc20 60601bda 0208cc00 0111690c 02116e10 OraClient9!kpuexec+0xba0
0191fc4c 01bc6d57 0208cc00 0211690c 02116e10 OraClient9!OCIStmtExecute+0x2a
0191fc74 1000ba8d 0208cc00 0211690c 02116e10 oci!OCIStmtExecute+0x37
0191fcbc 100149a2 00000001 020a3308 01141b70 SQLAPI!ora8ConnectionHandles::ora8ConnectionHandles+0x4b6d
0191fe6c 00408cc8 0191feac 0191feb0 0191feb4 SQLAPI!SACommand::Execute+0xa2
0191fec8 00411156 0191fef8 0191fefc 029a7288 BillChange+0x8cc8
0191ff78 004101b8 0191ffb4 00422303 01141bf0 BillChange+0x11156
0191ff80 00422303 01141bf0 00000000 0000001a BillChange+0x101b8
0191ffb4 77e6b388 01141b70 00000000 0000001a BillChange+0x22303
0191ffec 00000000 004222a4 01141b70 00000000 KERNEL32!lstrcmpiW+0xb7
SQLAPI是一个访问数据库的库。有好多程序在用,应该没啥问题。BillChange是我程序的名子。
我从这里看不出什么问题了,觉得像oracle客户端的问题。但这个机率应该挺小吧。不知道哪位大哥给点建议。万分感激。。

解决方案 »

  1.   

    结合你的BillChange的程序的PDB文件,定位这些对应的函数代码.
    0191fec8 00411156 0191fef8 0191fefc 029a7288 BillChange+0x8cc8
    0191ff78 004101b8 0191ffb4 00422303 01141bf0 BillChange+0x11156
    0191ff80 00422303 01141bf0 00000000 0000001a BillChange+0x101b8
    0191ffb4 77e6b388 01141b70 00000000 0000001a BillChange+0x22303
      

  2.   

    进程没了就是程序崩了,比较常见的问题,如果访问到系统的内核很容易表现出进程挂掉。DMP都抓了,配合PDB文件就能找出出错代码啊
      

  3.   

    crashrpt
    崩溃后生成dump文件,结合pdb,就可以调试了
      

  4.   

    也不要太相信库,我曾经用过一个ADO的库,估计也有很多人在用
    其它的也没有问题,但是连续写4~5天的二进制字段就会出错,也查不出原因
    最后只好又用ODBC了
      

  5.   

    查找代码里有没有混入ExitProcess()或exit()等函数。
      

  6.   


    //每个函数都添加
    try()
    {
    //
    }
    catch (_com_error e)
    {
    WriteLog(e.ErrorMessage());
    return FALSE;
    }