- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我之前 question regarding exceptions 的后续.
我有一些要维护的遗留代码。它有一个我很难理解的自定义内存管理组件。
我对系统的理解是这样的:
调用函数要求为其分配一些内存,提供所需的初始内存量 (needed
) 和最大内存量 (max
)。这调用:
base = VirtualAlloc(0, max, MEM_RESERVE, PAGE_NOACCESS);
据我所知保留内存但不提供访问权限。换句话说,如果我尝试写入保留段,我会遇到访问冲突。
然后调用:
VirtualAlloc(base, needed, MEM_COMMIT, PAGE_READWRITE);
这使得 needed
内存量从 base
开始可访问。
当试图检测何时需要访问更多内存时,棘手的部分就来了。我的理解是,系统会尝试在发生访问冲突异常时捕获它们,并在地址上调用 VirtualAlloc
以使内存可访问。
它通过声明以下方法来做到这一点:
unsigned long __cdecl
exceptionCatch(struct _EXCEPTION_RECORD* er, void*, struct _CONTEXT* cr, void*)
{
if( er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION
&& ExtendBuffer( (void*)er->ExceptionInformation[1] ) )
return ExceptionContinueExecution;
return ExceptionContinueSearch;
}
然后,它使用这段特别可怕的代码将其注册为堆栈顶部的异常处理程序(我认为):
void __cdecl SetHandler(bExceptionRegistration& v)
{
__asm
{
mov eax, 8[ebp] ; get exception register record to install
mov ecx, fs:[0] ; get current head of chain
cmp ecx, eax ; should we be at head?
jb search
mov [eax], ecx ; save current head
mov fs:[0], eax ; install new record at head
jmp short ret1
search:
cmp [ecx], eax ; at proper location yet?
ja link
mov ecx, [ecx] ; get next link
jmp search
link:
mov edx, [ecx]
mov [eax], edx ; point to next
mov [ecx], eax
ret1:
}
}
此方法通过在方法作用域中实例化特定类来调用。看起来它只将处理程序应用于当前堆栈上下文;例如,如果异常未传播到当前方法,则调用函数中抛出的异常不会由当前方法处理。
所有这一切的结果是,不仅没有捕获到访问冲突,而且还禁用了当前堆栈顶部的异常处理。我在 exceptionCatch
函数中设置了断点,执行似乎没有进入它。
我想我的主要问题是:
我不认为像 set_unexpected
这样的东西是可行的,因为内存管理只适用于这个特定的库,客户端应用程序可能(在我们的例子中确实)有它自己的意外异常处理程序。
编辑:
每个堆栈的处理程序的设置和取消设置是通过使用以下类构造函数和析构函数声明类 bExceptionRegistration
来完成的:
bExceptionRegistration :: bExceptionRegistration() : function(exceptionCatch)
{
SetHandler(*this);
}
bExceptionRegistration :: ~bExceptionRegistration()
{
UnsetHandler(*this);
}
因此,要为特定堆栈范围实际设置处理程序,您需要:
void someFunction()
{
bExceptionRegistration er;
// do some stuff here
}
编辑:我猜测可能最合适的解决方案是将代码中的 bExceptionRegistration
声明替换为 __try, __except
block 。然而,我希望避免这种情况,因为它在很多地方都存在。
最佳答案
如果没有看到更多代码,我不能 100% 确定这一点。它不会在堆栈顶部注册异常处理程序,但会使用一个技巧在定义 EXCEPTION_REGISTRATION
结构的地方插入异常处理程序。因此,例如(在您的情况下,它的实现方式可能有所不同):
void function3(EXCEPTION_REGISTRATION& handler)
{
SetHandler(handler);
//Do other stuff
}
void function2(EXCEPTION_REGISTRATION& handler)
{
__try
{
//Do something
function3(handler);
}
__except(expression)
{
//...
}
}
void function()
{
EXCEPTION_REGISTRATION handler;
//..Init handler
function2(handler)
}
当您调用 SetHandler
时,它将像在函数范围内一样插入异常处理。所以在这种情况下,当您调用 SetHandler
时,它看起来好像函数中有一个 __try __except block 。
因此,如果 function3 中有异常,函数中的处理程序将首先被调用,如果该处理程序不处理它,将调用 SetHandler
安装的处理程序。
关于c++ - 有没有更好的方法来实现这种内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8352151/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在现代 IDE 中,有一个键盘快捷键可以通过键入文件名称来打开文件,而无需将手放在鼠标上。例如: Eclipse:Cmd|Ctrl + Shift + R -> 打开资源 IntelliJ:Cmd|C
有什么东西会等待事件发生(我正在等待的是 WebBrowser.DocumentCompleted),然后执行代码吗?像这样: If (WebBrowser.DocumentCompleted) 不会
我使用 PHP Minify,它很棒。但我的问题是,是否有任何 PHP 插件或其他东西可以自动检测 javascript/css 代码并自动缩小它?谢谢。 最佳答案 Javascript 压缩器? 看
有没有一种语言,类似什么CoffeeScript是JavaScript,编译成windows batch|cmd|command line的语言? 我指的cmd版本是基于NT的,尤其是XP sp3及以
我知道我可以 ,但是,我真的宁愿有一个任务,我可以从任何可以使用所有(或至少大部分)属性的操作系统调用 copy ,但这并没有消除 unix 上的权限。 我想知道是否已经有解决方案,或者我必须自己编
我正在使用 Vuejs(不使用 jQuery)开发一个项目,该项目需要像 jvectormap 这样的 map 但正如我所说,我没有使用 jQuery,那么是否有任何其他库可以在不使用 jQuery
想要进行一个简单的民意调查,甚至不需要基于 cookie,我不在乎投了多少票。有没有类似的插件或者简单的东西? 最佳答案 这是一个有用的教程 - 让我知道它是否适合您 using jQuery to
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
var FileBuff: TBytes; Pattern: TBytes; begin FileBuff := filetobytes(filename); Result := Co
我想要一个 vqmod xml 文件来添加一次上传多个图像的功能。身边有这样的事吗? 编辑:Opencart版本:2.1.0.1 最佳答案 最后我写了一个xml来添加到opencart 2.1.0.1
所以考虑这样的函数: public void setTemperature(double newTemperatureValue, TemperatureUnit unit) 其中Temperatur
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是 ggplot2 的新手,一直在尝试找到一个全面的美学列表。我想我理解它们的目的,但很难知道哪些可以在各种情况下使用(主要是几何图形?)。 Hadley 的网站偶尔会在各个几何图形的页面上列出可用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否有任何 PHP 函数可以将整数转换为十万和千万? 900800 -> 9,00,800 500800 -> 5,00,800 最佳答案 由于您已在问题标签中添加了 Yii,因此您可以按照 Yii
使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。 是否
我的项目需要一个像 AvalonDock 这样的对接系统,但它的最后一次更新似乎是在 2013 年 6 月。是否有更多...积极开发的东西可以代替它? 最佳答案 AvalonDock 实际上相当成熟并
我正在寻找一个可以逆转 clojure 打嗝的函数 所以 turns into [:html] 等等 根据@kotarak的回答,这现在对我有用: (use 'net.cgrand.enliv
我是一名优秀的程序员,十分优秀!