我正在尝试使用Steve Sanderson的博客文章来编辑我的ASP MVC 3视图中的可变长度列表.项目构建正常,但是每当呈现局部视图时,程序就会出现using(Html.BeginColletionItem()此错误:
AccessViolationException was unhandled
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Run Code Online (Sandbox Code Playgroud)
这是完整例外的屏幕截图

完整的堆栈跟踪如下
at Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Connection conn)
at Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(Object acceptedSocket)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
Run Code Online (Sandbox Code Playgroud)
局部视图
@model Monet.Models.AgentRelationshipCodes
@using (Html.BeginCollectionItem("AgentRelationshipCodes")) @*Exception thrown here*@
{
<tr>
<td>@Html.EditorFor(model => model.EffectiveDate, "NullableDate", new { @class …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc access-violation asp.net-mvc-3 begincollectionitem
我正在使用第三方专有DLL,我无法获得源代码.但是,使用SWIG 1.3.39自动生成的包装代码可供我使用.包装器代码包含一个C++文件,该文件编译(使用一些描述DLL的头文件)到DLL和一个C#项目,它使PInvoke调用C++包装器DLL.
根据我对供应商文档的解释,我已将解决方案中的所有内容编译为x86或x64,具体取决于目标平台.供应商提供专有DLL的32位和64位版本,并且我确保我使用正确的版本给定构建.我的机器是32位的.在我的机器上,在发布版本或调试版本中测试我的应用程序的x86版本似乎工作正常.但是,在64位上,应用程序在调试模式下工作,但在发布模式下因System.AccessViolationException而失败.
我已经阅读了这篇很好的博客文章,似乎很好地描述了调试与发布问题,以及引发博客文章的这个问题和答案.但是,我不确定如何在这种情况下解决问题.
AccessViolationException似乎是在第一次从C++包装器返回(或尝试返回)任何实际长度的字符串时发生的.这是违规的C#代码:
// In one file of the C# wrapper:
public string GetKey()
{
// swigCPtr is a HandleRef to an object already created
string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
return ret;
}
// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);
Run Code Online (Sandbox Code Playgroud)
来自C++包装器的麻烦的C++代码:
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ; …Run Code Online (Sandbox Code Playgroud) 当(且仅当)我编译我的程序与/Og 和 /GL标志使用Windows Server 2003 DDK C++编译器(这是精对WDK 7.1和Visual Studio 2010的!),我得到一个访问冲突,当我运行以下命令:
#include <algorithm>
#include <vector>
template<typename T> bool less(T a, T b) { return a < b; }
int main()
{
std::vector<int> s;
for (int i = 0; i < 13; i++)
s.push_back(i);
std::stable_sort(s.begin(), s.end(), &less<const int&>);
}
Run Code Online (Sandbox Code Playgroud)
当我将最后一行更改为时,访问冲突消失了
std::stable_sort(s.begin(), s.end(), &less<int>);
Run Code Online (Sandbox Code Playgroud)
- 换句话说,当我让我的项目被复制而不是仅仅被引用时它会消失.
(我没有任何形式的多线程.)
为什么会发生这样的事情?我通过路过来调用一些未定义的行为const &吗?
编译器标志:
/Og /GL /MD /EHsc
Run Code Online (Sandbox Code Playgroud)链接器标志:( 无)
INCLUDE环境变量:
C:\WinDDK\3790.1830\inc\crt …Run Code Online (Sandbox Code Playgroud)我的客户希望在应用程序的客户表单中有一个文本框,该表单提供了已启动街道名称的适用结尾.他开始输入一个街道名称,文本框提供了一个街道列表,这些街道以他在文本框中输入的字符序列开头.
我对自己说:没关系,文本框具有AutoCompleteCustomSource属性,即使常见的街道名称列表比启动时预先填充的更长,我可以用查询命中数据库,填充AutoCompleteStringCollection并显示对用户而言.
现在就是这样的事情:如果我在每个按键/键盘上填充列表,程序崩溃并抛出AccessViolationException.
我发现那是因为:控件正在显示自动完成列表的同时被修改,导致崩溃.
刷新自动完成列表时,将使用新指针重新创建控件.键盘和鼠标事件(KeyPress,MouseOver,MouseLeave,MouseHover)尝试引用旧控件的指针,这些指针现在在内存中无效,从而导致发生内存访问冲突.
基础AutoComplete实现不允许在窗口上设置AutoComplete候选列表对象后更改它.为了允许更改列表,WinForms会破坏Edit控件或ComboBox并重新创建它.如果在自动完成窗口仍在使用它时销毁基础控件,则会导致异常.
我在MSDN上看到了这个,他们的决议:
不要在关键事件期间动态修改自动完成候选列表.
我也尝试过这个帖子
那么,如果我坚持提供按键按键的适用街道名称,我怎么能做到这一点呢?
注意:我知道你可以通过创建一个自定义控件来实现这一点,但是它可以用纯粹的编码魔法来完成吗?
我花了最后一小时解决C#中非托管内存的奇怪问题.
首先,一点背景.我有一个C#DLL导出一些本机方法(通过这个很棒的项目模板),然后由Delphi应用程序调用.其中一个C#方法必须将结构传递回Delphi,然后将其转换为记录.我已经可以告诉你感到恶心,所以我不再详细介绍了.是的,这很难看,但替代方案是COM ......不,谢谢.
以下是有问题的代码的简化:
IntPtr AllocBlock(int bufferSize)
{
IntPtr ptrToMem = Marshal.AllocHGlobal(bufferSize);
// zero memory
for(int i = 0; i < bufferSize; i++)
Marshal.WriteInt16(ptrToMem, i, 0);
return ptrToMem;
}
Run Code Online (Sandbox Code Playgroud)
实际上,这里有一些其他的东西,与本机资源跟踪相关,但基本上就是这样.如果你已经发现了这个bug,做得好.
本质上,问题在于我使用WriteInt16而不是WriteByte由于智能感知辅助的拼写错误导致最后一次迭代在缓冲区末尾写入一个字节.我想是容易犯的错误.
然而,在调试器中谚语的这种痛苦使得它在调试器中无声地失败,并且应用程序的其余部分继续工作.内存已经分配,除了最后一个字节之外的所有字节都是零,所以它工作正常.在调试器外部启动时,它会导致应用程序因访问冲突而崩溃.经典的Heisenbug情况 - 当您尝试分析它时,该错误消失了.请注意,此崩溃不是托管异常,而是真正的CPU级访问冲突.
现在,这让我感到困惑有两个原因:
连接任何调试器时都没有抛出异常 - 我尝试了Visual Studio,CodeGear Delphi 2009和OllyDbg.附上后,该程序运作良好.没有附加时,程序崩溃了.所有尝试都使用了完全相同的可执行文件.我的理解是,调试不应该改变应用程序的行为,但它显然是这样做的.
通常情况下,我希望此操作AccessViolationException在我的托管代码中导致,但它会因内存访问冲突而死亡ntdll.dll.
现在,公平地说,我的案例可能是C#历史上最模糊(也可能是错误的)角落案例之一,但我对于如何连接任何调试器来防止崩溃感到迷茫.我特别感到惊讶的是它在OllyDbg下运行,它不会像Visual Studio那样干扰任何接近的过程.
那么,到底发生了什么?为什么在调试期间吞下(或不引发)异常,而不是在调试器之外?当我试图Marshal.WriteInt16在分配的内存块之外调用时,为什么没有抛出托管访问冲突异常,因为文档说它应该?
所以基本上我希望将一个字节数组写入文件,但程序崩溃了.append.exe中0x7766DEE1(KernelBase.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00000000.
BYTE *image ;
BYTE *bigMem;
#define REASONABLY_LARGE_BUFFER 16777216
file = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
fileSize = GetFileSize(file, NULL);
bigMem = (BYTE *)HeapCreate(NULL, REASONABLY_LARGE_BUFFER, 0);
image = (BYTE *)HeapAlloc(bigMem, HEAP_ZERO_MEMORY, fileSize);
if (bigMem == NULL || image == NULL){
printf("Allocation failed");
return EXIT_FAILURE;
}
printf("We are writing to the file %p, with data location %p, and filesize %d\n", file, image, fileSize);
LPDWORD at = 0;
WriteFile(file, image, fileSize, at, NULL);
Run Code Online (Sandbox Code Playgroud)
该印刷品说:我们正在写入文件00000038,数据位置为02451590,文件大小为161169
我正在尝试按照 vulkan-tutorial.com 的精彩教程学习 Vulkan,但在必须创建交换链时遇到了一些问题。如标题所述,vkCreateSwapchainKHR会产生以下错误:Access violation executing location 0x0000000000000000.
教程建议这可能与蒸汽覆盖层发生冲突。对我来说情况并非如此,因为从教程中复制了整个代码。
我试图找出我的代码出了什么问题,并学习如何调试此类问题,因为我将来不会有参考代码。有罪的线看起来是这样的:
if (vkCreateSwapchainKHR(device, &swapChainCreateInfo, nullptr, &swapChain) != VK_SUCCESS) {
throw std::runtime_error("Could not create swap chain");
}
Run Code Online (Sandbox Code Playgroud)
我在这一行设置了一个断点,以将代码中的参数值与参考代码中的值进行比较。据我所知,没有区别。(当然地址不一样)
我应该在哪里查找代码中的问题?变量swapChain是NULL预期的。一个错误的形成swapChainCreateInfo不应该使vkCreateSwapchainKHR崩溃。它只会让它返回一些不是的东西VK_SUCCESS。并且设备创建没有问题:
if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
throw std::runtime_error("Failed to create logical device");
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 我正在使用验证层VK_LAYER_LUNARG_standard_validation,我的createInfo设置如下。
// Useful functions and structures
VkPhysicalDevice physicalDevice;
VkSurfaceKHR surface;
VkSwapchainKHR swapChain;
struct QueueFamilyIndices {
std::optional<uint32_t> graphicsFamily;
std::optional<uint32_t> …Run Code Online (Sandbox Code Playgroud) 在ImplicitOperator中使用David Brown的可下载示例我将一个经常工作的DOT文件的GraphViz渲染器组合到一个内存中的图像中.
不幸的是,我的版本因为我已经使用IIS 7 ASP.NET Web应用程序的8次执行中的1次失败率而失败.我知道DOT文件数据是一致的,因为我将失败的实例与工作实例,它们是相同的.
由于大卫的网站似乎暗示博客的未来不确定,我将在这里重新打印互联网文章.希望他不介意.失败是在示例的末尾,在第三个语句集的RenderImage中.我已经注意到// TODO的失败行:......失败总是发生在那里(如果它发生的话).通过这一行,g和gvc指针不为零,并且正确填充了布局字符串.
我真的不希望任何人在运行时调试它.相反,我希望对互操作代码的一些静态分析可能会揭示问题.我想不出任何先进的编组技术 - 两个IntPtrs和一个字符串不需要很多帮助,对吧?
谢谢!
旁注:我看了一下MSAGL的试用版,我没有留下深刻的印象 - 微软99美元,我希望节点布局和/或文档的更多功能可以解释我所缺少的内容.也许我从QuickGraph到AGL的快速端口不公平地偏向于我的经验,因为这些方法存在一些根本的差异(例如,以边缘为中心与以节点为中心).
public static class Graphviz
{
public const string LIB_GVC = "gvc.dll";
public const string LIB_GRAPH = "graph.dll";
public const int SUCCESS = 0;
/// <summary>
/// Creates a new Graphviz context.
/// </summary>
[DllImport(LIB_GVC)]
public static extern IntPtr gvContext();
/// <summary>
/// Releases a context's resources.
/// </summary>
[DllImport(LIB_GVC)]
public static extern int gvFreeContext(IntPtr gvc);
/// <summary>
/// Reads a …Run Code Online (Sandbox Code Playgroud) 我在c#中待了很长时间,但我从未遇到过这种错误.首先,你是否看到关于这个单个代码块的任何错误(可能是错误的)(除了它的逻辑当然,我知道它总是返回0)?
public static int GetDecimals(MySimpleEnum val)
{
int result = 0;
switch (val)
{
case MySimpleEnum.Base:
case MySimpleEnum.Slow:
case MySimpleEnum.Normal:
case MySimpleEnum.Quick:
case MySimpleEnum.Fastest:
result = 0;
break;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
发布项目设置: DEBUG constant = false; TRACE constant = true; 优化Code = true; 输出/高级/调试信息=无;
IIS =版本7.5
此方法具有指定的释放设置会抛出" System.AccessViolationException:尝试读取或写入受保护的内存.这通常表示其他内存已损坏."
这是有趣的部分.这些情况是,它不会抛出此异常:
注意事项:
我知道如何解决这个问题.但我不喜欢关闭问题,而不知道原因.此外,我希望将来避免这种情况.你认为你可以帮助我吗?如果它是一些空引用异常,为什么会发生这种情况?为什么它是特定于调试/发布或特定于IIS版本?
*注2:
最近,我在发布了与缺少DLL的(System.Net.Http.Formatting.dll,System.Web.Http.dll,System.Web.Http.WebHost.dll)的问题.这是因为一些微软的安全更新.也许这是类似的东西.*
编辑1 添加枚举声明的结构.
public enum …Run Code Online (Sandbox Code Playgroud) 我有一个C++客户端到C++/CLI DLL,它初始化一系列C#dll.
这曾经工作过.失败的代码没有改变.在抛出异常之前,不会调用已更改的代码.我的编译环境已经改变,但是在具有类似于旧环境的机器上重新编译仍然失败.(编辑:我们在答案中看到这并不完全正确,我只是在旧环境中重新编译库,而不是库和客户端一起重新编译.客户端项目已经升级,无法轻易返回.)
除了我之外,有人重新编译了库,我们开始遇到内存管理问题. The pointer passed in as a String must not be in the bottom 64K of the process's address space. 我重新编译了它,并且没有代码更改都运行良好.(警报#1)最近它被重新编译,并且字符串的内存管理问题重新出现,而这次它们并没有消失.新的错误是Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
我很确定问题不在我看到异常的位置,代码在成功和失败的构建之间没有变化,但我们应该检查完成.忽略事物的名称,我对这些字符串的设计没有多少控制权.抱歉混淆,但请注意_bridge并且bridge是不同的事情.由于这个问题已经太长,所以缺少大量代码.
在库中定义:
struct Config
{
std::string aye;
std::string bee;
std::string sea;
};
extern "C" __declspec(dllexport) BridgeBase_I* __stdcall Bridge_GetConfiguredDefaultsImplementationPointer(
const std::vector<Config> & newConfigs, /**< new configurations to apply **/
std::string configFolderPath, /**< folder …Run Code Online (Sandbox Code Playgroud) access-violation ×10
c# ×5
c++ ×5
.net ×3
.net-4.0 ×1
asp.net ×1
asp.net-mvc ×1
c++-cli ×1
exception ×1
file-io ×1
graphviz ×1
iis ×1
marshalling ×1
memory ×1
pinvoke ×1
stl ×1
swig ×1
vb.net ×1
visual-c++ ×1
vulkan ×1