约有 17 项符合查询结果, 以下是第 1 - 2项。
费时 < 1 秒。
哦,想起来了,按楼主的实现方式,还有一个地方需要注意,那就是,如果这个函数是作为dll发布给使用者的话,要发布两个版本,debug版本和release版本。
并且说明,如果使用者的模块是debug方式编译的,也要使用该dll的debug版;如果使用者的模块是release版,也要使用dll的release版本。
为什么呢?
简单地说,是因为debug方式分配的内存,不能用release的方式释放,反之亦然。
这个问题不是想象出来的,是我们很早以前碰到过,不敢专有,跟楼主分享下。:)
后来怎么解决的这个麻烦我忘记了,不过,用“谁分配谁释放”的原则,应该是不会出现这种麻烦了,呵呵~...
Posted in Windows内核调试
by
dos
on 2009-09-17
祝贺楼主问题解决!呵呵~
不过针对楼主目前的解决方法以及遵循“谁分配谁释放”原则的好处,我还想啰嗦几句,唉~人老了,就爱唠叨,呵呵~...
假设一种情况,调用者根据返回值,发现该内存需要释放,那么如何释放呢?
delete ptr?
delete[] ptr?
如果函数实现者是个忠实的c fans,使用了malloc分配了空间,是否相应的应该用free(ptr)?
或者调用者是个过度喜欢c++的fans,为了数据操作上的方便,new 了一个c++的类(还在类的析构函数里释放了操作中需要的一些临时空间,呵呵~有些变态哈,要不说是过度的C++ fans呢),不过在返回的时候将类指针强制转换成了PULONG类型的指针,那调用者是不是要向函数实现者强索那个类结构,然后delete ...
Posted in Windows内核调试
by
dos
on 2009-09-17
上下班路上还在想工作计划,回家之后,一边吃饭一边整理思路,一边看电视一边想程序问题,一边睡觉一边梦见解决问题的方法,这个....算不算加班呢?
记得谁谁谁说过,如果找到自己喜欢的工作,工作中做的事情就是自己喜欢的事情,那么工作就是生活,生活就是工作。对于这样的人,就没有什么加不加班一说了,比如MJ0011,不知加班是什么意思的,应该属于此类。
视工作为生存手段,糊口工具的,则常常会有加班的感觉。
有加班的感觉,就会有工作、生活的界限,就会有8小时工作时间和8小时之外的概念。
其实做software的都加班的,只是有的意识到了,有的没有意识到而已。
Posted in 软件物语
by
dos
on 2009-09-16
不知道楼主的问题上下文是什么,发现是在“windows内核”版发的帖,可能指的是在编写驱动程序遇到的问题吧。
不过这个问题具有普遍性,普通c/c++应用程序同样会有这样的问题。同样会碰到诸如调用一个函数,得到一个指向一个字符串的指针等...
楼主的要求是“如何判断一个指针指向的地址是动态分配的空间还是常量区”。
这个...我目前还没有头绪,呵呵~
不过,幸好,楼主的帖子表明了楼主的需求,那就是“释放用完后应该被释放的内存,避免出现内存泄漏”。
这个,我倒是有些思路:)
记得有个原则,那就是“谁分配谁释放”。
楼主可以采用这个原则,来跟那个提供返回内存指针的函数协作。即让这个函数的实现者在如下2个方案中做一个选择:
1、被调用者分配释放内存。要求函数实现者再提供一个释放指针的函 ...
Posted in Windows内核调试
by
dos
on 2009-09-16
嗯,这个“自用”的dll对应的lib...呵呵~可能不好找。试想,假设你自己发布了一款产品,如果产品包中也有些自己开发的dll,你也不会把这些自己开发的dll所对应的lib也release出来吧,呵呵~
不过有一个办法,如果你一定要用一个没有lib的dll,可以用显式加载的方式,包括用这个windows自带的dll。不过这样有些折腾。好像没有什么必要哈,毕竟VS各个版本,包括.net的运行环境安装包都是免费下载,可以合法跟随自己的产品重新发布的。
不知道楼主仅仅是作技术研究,还是遇到什么具体的问题,希望能通过链接到这个windows自带dll的方式来解决?
Posted in C/C++本地代码调试
by
dos
on 2009-09-11
可以使用depends来查看某个dll的版本;
dll是动态链接库,程序运行的时候才会加载的。
dll加载方式有两种,一种是显式加载,就是在程序里调用LoadLibrary来加载。此种方式可以以全路径指定加载的dll名称,所以完全可控,基本上是想加载哪个dll就加载哪个,呵呵~
还有一种加载方式是隐式加载,楼主问的估计是此类方式。
以隐式方式加载dll的程序,在运行时加载哪个dll,取决于程序编译时link了哪个lib。如果link了msvcrt90.dll对应的的lib,那么程序运行时就会试图加载msvcrt90.dll。
所以说,如果想加载某个版本的msvcrt ...
Posted in C/C++本地代码调试
by
dos
on 2009-09-10
如果知道被调函数的调用类型,应该可以将EIP直接设为“调用者在该函数返回后的地址”。当然除了设好EIP,在恢复执行前,还要将ESP和EBP的值设成调函数之前的状态,方法是:
如果是调用者清栈(cdecl ),那就不用改ESP,因为函数返回后,EIP就是call 函数的下一句,也就是清栈的那句,这样直接设置EIP然后恢复程序运行应该是没问题的,不过,前提是EBP也是调用函数前的状态;
如果是被调函数清栈(stdcall),这时候如果知道被调函数的参数个数,可以根据参数个数恢复ESP,这一点应该不难;如果不知道参数个数,那就要找到被调函数的ret语句,根据ret后面的值,设置ESP,然后恢复程序运行。同样,要保证EBP是调用前状态。
不知道我是不是理解了楼主的问题,呵呵~
Posted in WinDbg
by
dos
on 2009-08-19
没报名参加,人在北京,想站在门口“楼(音:lou,一声)一眼”都没戏,遗憾~...
Posted in 活动建议
by
dos
on 2008-09-03
有了一定的调试理论知识,确实可以做些实践工作了。光看不练,只会让学到的知识再回归书本。
虽然我从事的工作主要还是在用户态应用,但是对内核、驱动这一领域还是有极大的热情和兴趣。目前在内核方面没有什么理论基础和实践经验,恐无力参与这次“挑战”,但是还是非常支持这个活动。
希望活动能一直办下去,至少要办到我能挑战一次。就怕挑战越来越难,那我就是“小明比小强小1岁,什么时候小明可以跟小强一样大”里的“小明”了...
Posted in 特殊的调试任务
by
dos
on 2008-08-29
哇塞~...Coding兄玩上硬件调试器啦,看链接上说,那个设备要数千美金呢,羡慕~羡慕~,厉害~厉害~..
Posted in Windows内核调试
by
dos
on 2008-08-22