首页
社区
课程
招聘
已解决,感谢各位大牛
发表于: 2007-10-28 20:11 9715

已解决,感谢各位大牛

2007-10-28 20:11
9715

我的程序是用createprocess建立进程,等待进程运行完之后再建立进程(10线程)。如此循环几万次之后出现程序初始化错误

STATUS_DLL_INIT_FAILED C0000143

此外当一条线程建立的进程出错,其他线程建立的进程都会出错。而关闭所有出错的进程之后再建立的进程是正常的

求解


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
看不明白!
我帮你顶起!
2007-10-28 22:19
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不知道解决办法,不过说一个原因可能相关或相同的问题,看对LZ是否有启发

定时循环调用CreateThread创建线程(线程函数几分钟后会中指),当创建一定数量线程之后,会创建失败,原因记得好像是“内存不足”,后来改用线程池来复用线程解决了此问题。
据此,个人认为线程中止时类似于HANDLE之类的线程相关的资源并未被完全释放(或许WINDOWS也有内存泄漏?不得而知)。
2007-10-28 22:21
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
if ( (hardErrorRetCode >= STATUS_SUCCESS)
&& (ResponseYes == hardErrorResponse) )
{
return STATUS_DLL_INIT_FAILED;
}
}
//
// 如果DLL的入口点函数返回0(表示失败),通知用户
//
if ( 0 == initRetValue )
{
DWORD hardErrorParam2;
DWORD hardErrorResponse2;
hardErrorParam2 = pModuleLoaderInfo->FullDllPath;
_NtRaiseHardError( STATUS_DLL_INIT_FAILED,
1, // 参数个数
1, // UnicodeStringParametersMask
&hardErrorParam2,
OptionOk, // 只能以“确定”作为响应
&hardErrorResponse2 );
if ( _LdrpInLdrInit )
_LdrpFatalHardErrorCount++;
return STATUS_DLL_INIT_FAILED;
}
}
}

建议把代码发出来看看。
2007-10-29 00:06
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
我遇到的问题是多进程环境。据说Exitprocess之后会将该进程的所有HANDLE和申请分配的内存都释放完毕,事实是不是这样就不知道了。。。

你说的问题与我的很相似。。。假如你的问题是普遍存在的,那么我即使使用类似的解决方案,不让进程终止,而是让进程继续别的任务,那么最终还是会出现你的问题。。。我建立的进程是MS的,该进程使用多线程工作,线程完成自己工作之后便会自己退出。。。
2007-10-29 10:52
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
6
相关代码几千行。。。没有相关注释,代码风格不好,估计放出来也没人有耐性看
2007-10-29 11:22
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
7
提供一种测试方法:先运行,直到有一个线程出错时,强制暂停所有线程,用内存整理工具整理下,然后再跑,看其他线程会不会出错
2007-10-29 19:04
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
据说是因为建立了新进程之后,把没返回的HANDLE释放造成的句柄泄露。。。

如果是这样,那么CREATETHREAD之后是不是也应该把返回的HTHREAD释放掉?
2007-10-30 12:24
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
9
都要closehandle的,核心编程上有,
你线程需要同步吗,有没有共享方面的问题
而且还没有搞清你到底是createprocess还是createthread:)是每createprocess后,该process在10次createtread吗
2007-10-30 13:32
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
现在不是什么CloseHandle的问题

我原来那个程序,资源都是预先分配好的,自己管理的。运行的时候用性能监视器记录,连续N个小时根本没有变化,结果到创建线程数目到某一临界值,内存曲线就会变化,一样出问题

同样的问题不只是创建线程,WININET接口好像也有类似的问题。你自己创建再关闭接口试试,次数到达某一数量级之后,将直接导致程序崩溃退出,全局的异常处理捕捉不到错误
2007-10-30 19:05
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
11
我是用10个线程建立10个进程,等待进程退出,然后再次建立进程。程序运行期,我的10个线程都是不会终止的。

我建立的进程是系统自带的,通过钩子取得目标进程里面我感兴趣的内容。
2007-11-1 18:28
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
12
可能我的问题跟你的问题不一样吧,修改以后暂时还没有长时间跑过。因为其他问题,程序的主要功能代码要作比较大的改动。。。。
2007-11-1 18:31
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
13
desktopheap看看sta0吧, 系统总的句柄数是有限的, 暴增就是泄了
2007-11-1 19:27
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
谢谢楼上指点

不过能否进一步指点下CLOSEHADNLE为什么还会出现错误?除了自己对已有HANDLE进行复用,还有什么方法解决?
2007-11-2 10:06
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
把程序连续运行试试,估计还有问题哈
服务器上的东西,稳定性比较麻烦
2007-11-2 10:10
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
16
CreateProcess以后要关闭子进程的主线程句柄,然后等子进程结束以后再关闭子进程的句柄.
2007-11-2 21:07
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"USERProcessHandleQuota"
2007-11-2 22:52
0
雪    币: 191
活跃值: (41)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
18
应该是桌面堆被耗完了。
http://blogs.msdn.com/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx
2007-11-3 11:11
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
19
是不是CreateProcess
DEBUG PROCESS?
是的话要关闭hThread和hProcess
2007-11-3 14:24
0
雪    币: 20
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
第一当你CloseHandle(线程句柄);后系统别不会立即回收你的将要kill的线程。
同理ExitProcess也应该如此,那么也就是说在你的进程结束后而你的线程的资源并没有立即释放,而你又立即开启了10个如此反复10万次系统资源可能就被耗尽。

我能想到的如此
2007-11-9 14:55
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
可能是资源或内存泄漏引起的,可以用Rational Purify之类的软件测试一下。
2007-11-10 03:04
0
游客
登录 | 注册 方可回帖
返回
//