基于ICorDebug的.NET调试器修改字符串变量值的问题求助
解决ICorReferenceValue.SetValue()修改字符串时的“值不在有效范围内”异常
以下是排查和解决该问题的关键操作步骤:
确保Eval上下文的正确性
必须基于当前调试栈帧创建ICorDebugEval实例,而非直接从进程或应用域创建。示例代码:// 假设已获取到当前调试线程ICorDebugThread thread.GetActiveFrame(out var frame); frame.CreateEval(out var eval);错误的Eval上下文会导致创建的字符串对象不在目标进程的有效内存空间内,直接触发SetValue的范围异常。
执行Eval并等待操作完成
调用NewString()后必须执行DoEval()并等待操作完成,才能获取有效的字符串引用:eval.NewString("要设置的新字符串内容", out var newStrValue); eval.DoEval(); // 等待Eval完成,可通过ICorDebugController的Continue配合调试事件监听实现 while (!eval.IsCompleted) { debugController.Continue(false); // 处理调试事件,直到Eval完成事件触发 }未等待Eval完成就尝试获取字符串地址,得到的是无效值,传入SetValue必然触发异常。
正确获取字符串的内存地址
将新创建的ICorDebugValue转换为ICorDebugReferenceValue,获取其在目标进程中的实际内存指针,再赋值给目标引用:newStrValue.QueryInterface(typeof(ICorDebugReferenceValue).GUID, out var newStrRef); (newStrRef as ICorDebugReferenceValue).GetValue(out var newStrAddr); // 对目标引用执行赋值操作 targetRef.SetValue(newStrAddr);直接传入
ICorDebugValue对象给SetValue是错误的,必须传入目标进程内的有效内存指针值。验证目标引用的类型匹配
确认ICorReferenceValue指向的对象确实是string类型:targetRef.GetValue(out var objAddr); debugProcess.GetObject(objAddr, out var objValue); objValue.GetType(out var type); type.GetName(out var typeName); // 检查typeName是否为"System.String"若目标引用指向非字符串类型,赋值字符串地址会触发范围异常。
内容的提问来源于stack exchange,提问作者Jan K.
相关产品推荐
相关产品推荐

