我一直在修改,调试,修改,调试(你知道演练),我只是无法弄清楚导致这些访问冲突的原因!
最典型的一个是在Skype4COM.dll中使用" 读取地址80000000 ",但我不怀疑它是导致它的代码.
我的第一个怀疑是我向Skype API发送了太多命令(通过Skype4COM),但在添加一些暂停逻辑后,为了确保Skype和COM对象能够跟上,我意识到这不是它 - 它仍然是发生的历史!
我正在使用Threads来执行此操作,即使不使用Threads,它仍然会引发AV.(我一次只使用一个线程)
这是我的Thread Execute方法:
procedure TMyThread.Execute;
Var
I : Integer;
User : PUser;
ReceiverName : String;
FullMessage : String;
PauseEvent : TEvent;
TimesToPause : Integer;
iPause : Integer;
J : Integer;
FExit : Boolean;
begin
inherited;
if Terminated then
Exit;
FreeOnTerminate := True;
CoInitialize(Nil);
FExit := True;
UserList := TList.Create;
SkypeThr := TSkype.Create(Nil);
PauseEvent := TEvent.Create(True);
Try
try
SkypeThr.Attach(10,False);
Synchronize(SyncBegin);
iMax := UserList.Count;
Synchronize(SyncSetMax);
LogID := 'N/A';
TimesToPause := Round(UserList.Count / 300);
// …Run Code Online (Sandbox Code Playgroud) 为了测试这个问题,我编写了一个最小的Windows应用程序.如果我在WM_PAINT处理程序中强制执行访问冲突,则此异常永远不会到达调试器.如果在没有调试器的情况下启动,则访问冲突也不会显示.通常,您应该获得Windows错误报告对话框.
深入挖掘似乎user32.dll中的某些内容会捕获所有传入的异常.这是正常的行为吗?我可以以某种方式控制它吗?是不是将所有异常都列为安全风险?至少它很烦人.
这是在Vista 64上使用32位和64位应用程序.在XP上,异常似乎按预期处理.其他Windows消息也有同样的问题.也许他们都是?
该WM_PAINT处理程序:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
*(int*)0 = 0;
EndPaint(hWnd, &ps);
break;
Run Code Online (Sandbox Code Playgroud) 我真的不明白这个错误是如何发生的.请自行检查代码
void dispatcherTimer_Tick(object sender, EventArgs e)
{
string srUrl = lstLocalIndex[irLocalIndex] + lstMainIndex[irMainIndex].Replace("0;","");
Task.Factory.StartNew(() =>
{
startNewWindow(srUrl);
});
}
void startNewWindow(string srUrl)
{
NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), srUrl);
}
Run Code Online (Sandbox Code Playgroud)
现在这段代码就是发生错误的地方.我还会附上截图
private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window
{
Thread thread = new Thread(() =>
{
T w = constructor(param);
w.Show();
w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown();
try
{
System.Windows.Threading.Dispatcher.Run();
}
catch
{
}
});
thread.SetApartmentState(ApartmentState.STA);
try
{
thread.Start();
}
catch
{
}
}
Run Code Online (Sandbox Code Playgroud)
此错误导致整个软件抛出错误并停止工作,即使我在新线程中调用它们:( …
c# wpf unhandled-exception memory-corruption access-violation
我一直在尝试在我的程序中追踪访问冲突时遇到问题.它是在第三次调用析构函数时发生的,恰好是析构函数完成时.
我花了好几个小时试图追踪这一点,所以我正在寻找有关我能做的事情的进一步建议.我正在用new和delete运算符创建类实例.Visual Studio输出窗口显示:
First-chance exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab.
Unhandled exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab.
有什么我可以做的,试图找出那些记忆位置的内容吗?
调用堆栈窗口显示以下内容(与我按时间顺序粘贴它的顺序相反,最早到最新):
Program.exe!Network::`scalar deleting destructor'() + 0x2b bytes C++
Program.exe!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() Line 754 + 0xf bytes C++
Program.exe!std::_String_val<wchar_t,std::allocator<wchar_t> >::~_String_val<wchar_t,std::allocator<wchar_t> >() Line 478 + 0xb bytes C++
Run Code Online (Sandbox Code Playgroud)
msvcp100d.dll!std :: _ Container_base12 :: _ Orphan_all()第214行+ 0x5字节C++
我对这些信息的最佳猜测是,有某种字符串变量引起了这个问题?有没有人对解释这些信息有任何建议?
任何其他建议也会有用,提前谢谢.
我在Windows 7下编码并使用Visual Studio 2010 Professional.
我正在尝试使用该ctypes模块来调用Windows的Common Item Dialog API.下面显示的代码大致基于MSDN文档中列出的步骤.它唯一的依赖是comtypes.GUID模块.
import ctypes
from ctypes import byref, POINTER, c_int, c_long
from ctypes.wintypes import HWND, HRESULT
from comtypes import GUID
CLSID_FileOpenDialog = '{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}'
IID_IFileDialog = '{42F85136-DB7E-439C-85F1-E4075D135FC8}'
#IID_IFileOpenDialog = '{D57C7288-D4AD-4768-BE02-9D969532D960}'
CLSCTX_SERVER = 5
COINIT_APARTMENTTHREADED = 2
FOS_PICKFOLDERS = 32
FOS_FORCEFILESYSTEM = 64
ole32 = ctypes.windll.ole32
CoCreateInstance = ole32.CoCreateInstance
CoInitializeEx = ole32.CoInitializeEx
CoInitializeEx(None, COINIT_APARTMENTTHREADED)
ptr = c_int()
error = CoCreateInstance(
byref(GUID(CLSID_FileOpenDialog)), None, CLSCTX_SERVER,
byref(GUID(IID_IFileDialog)), byref(ptr))
assert error == 0
ptr = ptr.value …Run Code Online (Sandbox Code Playgroud) 所以我有一个我生命中见过的最奇怪的虫子.我已经购买了一本DirectX 11书,附带了一些[示例代码]:http://www.d3dcoder.net/d3d11.htm 我很确定在某些时候我设法编译并运行每个示例应用程序,但现在,我在运行时出现"访问冲突写入位置0xCCCCCCCC"错误.
现在,这发生在以下一行:
ShadowsApp::ShadowsApp(HINSTANCE hInstance) : D3DApp(hInstance)
{
mMainWndCaption = L"Shadows Demo"; <- Crashes here !!!
mLastMousePos.x = 0;
mLastMousePos.y = 0;
...
}
Run Code Online (Sandbox Code Playgroud)
mMainWndCaption在.h中被声明为这样
std::wstring mMainWndCaption;
Run Code Online (Sandbox Code Playgroud)
并在ShadowsApp继承自的类的构造函数中使用默认值进行设置
D3DApp::D3DApp(HINSTANCE hInstance) :
mhAppInst(hInstance),
mMainWndCaption(L"D3D11 Application"),...
Run Code Online (Sandbox Code Playgroud)
我想,这已经很奇怪了......现在最奇怪的部分是当我在d3dApp.h中声明任何类型的ANY变量时,我不再有"访问冲突写入位置0xCCCCCCCC"错误,所有内容都构建并运行完美.作为一名C#程序员,这对我来说绝对没有意义.如何在类中声明一个随机变量可以"修复"这样的事情?!
任何建议将不胜感激:-)
我正在运行此代码,在64位vc ++ 2005上编译,在Windows Server 2008 R2上使用32GB.for循环中存在访问冲突.
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
double *x = new double[536870912];
cout << "memory allocated" << endl;
for(long int i = 0; i < 536870912; i++)
{
cout << i << endl;
x[i] = 0;
}
delete [] x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果新双[536870912]中没有异常,为什么在对特定阵列位置进行赋值时会出现访问冲突?
值得一提的另一点是,该程序在另一台计算机上成功测试.
我有一个glfwSetCharCallback函数的问题.每当我调用它时,glfwPollEvents都会抛出一个AccessViolationException:"试图读取或写入受保护的内存.这通常表明其他内存已损坏."
我创建了一个非常简单的包装器来演示问题:
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace Test
{
public delegate void GlfwCharCallback(GlfwWindow window, Char character);
[StructLayout(LayoutKind.Explicit)]
public struct GlfwMonitor
{
private GlfwMonitor(IntPtr ptr)
{
_nativePtr = ptr;
}
[FieldOffset(0)] private readonly IntPtr _nativePtr;
public static readonly GlfwMonitor Null = new GlfwMonitor(IntPtr.Zero);
}
[StructLayout(LayoutKind.Explicit)]
public struct GlfwWindow
{
private GlfwWindow(IntPtr ptr)
{
_nativePtr = ptr;
}
[FieldOffset(0)] private readonly IntPtr _nativePtr;
public static GlfwWindow Null = new GlfwWindow(IntPtr.Zero);
}
public class Wrap
{
[DllImport("GLFW3", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] …Run Code Online (Sandbox Code Playgroud) 我有以下C#类
public class BadClass
{
public BadClass(int? bad = 1)
{
}
}
public class GoodClass
{
public GoodClass(int? good = null)
{
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它们都具有可选的可空参数作为其构造函数的一部分,唯一的区别是BadClass将参数default设置为null以外的其他值.
如果我尝试在F#中创建这些类的实例,这就是我得到的:
这很好用:
let g = GoodClass()
Run Code Online (Sandbox Code Playgroud)
这会抛出NullReferenceException:
let b = BadClass()
Run Code Online (Sandbox Code Playgroud)
这会引发AccessViolationException
let asyncB = async { return BadClass() } |> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?
编辑
使用ILSpy对其进行反编译,这是F#的输出
C#类位于一个名为InteopTest的程序集中[原文如此]
ILSpy到C#
GoodClass g = new GoodClass(null);
BadClass b = new BadClass(1);
FSharpAsyncBuilder defaultAsyncBuilder = ExtraTopLevelOperators.DefaultAsyncBuilder;
FSharpAsync<BadClass> fSharpAsync = defaultAsyncBuilder.Delay<BadClass>(new Program.asyncB@10(defaultAsyncBuilder));
FSharpAsync<BadClass> computation = fSharpAsync;
BadClass asyncB = FSharpAsync.RunSynchronously<BadClass>(computation, …Run Code Online (Sandbox Code Playgroud) 有点困惑,为什么我有一个问题.它花了我一段时间,但已经把问题解决了,这是最简单的情况我得到以下奇怪的(无论如何我的眼睛)行为.
我有一个基类:
public abstract class FailedSubmitterBase
{
public FailedSubmitterBase(UserApplicationToken userApplicationToken)
{
}
public abstract int ResubmitFailed(ProviderRequest request, Access.CentralServices.CSService.Itinerary csItinerary,
ImpersonatedUserDetails impersonatedUser, BasketItem basketItem, CRMResponseDetails crmResponseDetails,
string crmUsername, string crmSuperUsername);
}
Run Code Online (Sandbox Code Playgroud)
和一个子实例:
public class CoreFailedSubmitter : FailedSubmitterBase
{
private string _emptyNarrativeString = "Failed to post to CS - Unspecified Error";
protected UserApplicationToken _userApplicationToken;
public CoreFailedSubmitter(UserApplicationToken userApplicationToken) : base(userApplicationToken)
{
_userApplicationToken = userApplicationToken;
}
/**/
public override int ResubmitFailed(ProviderRequest request, Access.CentralServices.CSService.Itinerary csItinerary,
ImpersonatedUserDetails impersonatedUser, BasketItem basketItem, CRMResponseDetails crmResponseDetails, string crmUsername, string crmSuperUsername) …Run Code Online (Sandbox Code Playgroud) c# abstract-class .net-4.0 access-violation visual-studio-2013