<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x" -->

---
title: AccessViolation in ObjectNative::IsLockHeld (part 1 of 2)
description: A deep debugging investigation traces an AccessViolationException crashing a .NET application (Orchard CMS) in clr!ObjectNative::IsLockHeld. Using WinDbg on a...
canonical: https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: AccessViolation in ObjectNative::IsLockHeld (part 1 of 2) | daily.dev
og:description: A deep debugging investigation traces an AccessViolationException crashing a .NET application (Orchard CMS) in clr!ObjectNative::IsLockHeld. Using WinDbg on a...
og:url: https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x
og:image: https://api.daily.dev/og/posts/1xTOuVN4x.png
og:image:alt: AccessViolation in ObjectNative::IsLockHeld (part 1 of 2)
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# AccessViolation in ObjectNative::IsLockHeld (part 1 of 2)

**[Kevin Gosse \(minidump.net\)](https://daily.dev/sources/minidump)** · 10 min read · 0 upvotes · 0 comments

## Summary

A deep debugging investigation traces an AccessViolationException crashing a .NET application (Orchard CMS) in clr!ObjectNative::IsLockHeld. Using WinDbg on a memory dump, the author identifies the crash originates from Monitor.IsEntered on an interned string lock, explains the CLR's sync block table and thin lock mechanism, and narrows down the cause to likely sync table or object header corruption, with resolution deferred to a follow-up part.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://minidump.net/accessviolation-in-objectnative-islockheld-part-1-of-2-7fae4b839f9a>

## Questions this post answers

### What is the sync block table in the .NET CLR and when does an object use it instead of a thin lock?

The sync block table stores extended locking and hashcode information for objects when the 4-byte object header runs out of room. This happens when a lock is contended (multiple threads waiting) or when GetHashCode is called on the object, since the hashcode must be stable even though object addresses can move during garbage collection. The object header then stores an index into this table instead of the lock data directly.

_Developers tracking down CLR lock corruption bugs can find deep debugging writeups like this on daily.dev._

### How do I resolve native stack frame addresses to managed method names in a WinDbg crash dump?

Use the ip2md command with the raw address from the native stack trace, for example !ip2md 0x00007ffb064c776f. WinDbg returns the MethodDesc, method name, class, method table, and JIT status, letting you map opaque addresses like clr!ObjectNative::IsLockHeld+0x4d back to a specific managed method such as Orchard.OutputCache.Filters.OutputCacheFilter.Dispose(Boolean).

_Anyone untangling native .NET crash dumps can browse similar WinDbg troubleshooting walkthroughs on daily.dev._

### Why would Monitor.IsEntered crash with an AccessViolationException in a .NET Framework application?

Monitor.IsEntered calls Monitor.IsEnteredNative, mapped internally to clr!ObjectNative::IsLockHeld, which reads the object's sync block to check lock ownership. A crash there with a register value of 0xffffffffffffffff indicates the sync block table or the object header holding the sync block index was corrupted before IsLockHeld was ever invoked, since the function only reads memory and performs no writes.

_Teams chasing elusive lock-related crashes in .NET services can find investigative deep dives like this on daily.dev._

## Similar posts on daily.dev

- [Locking and Concurrency Control in .NET 10](https://daily.dev/posts/locking-and-concurrency-control-in-net-10-um1rhzp52) · Waseem .NET Newsletter · 14 upvotes · 0 comments
- [The lock that killed my migration](https://daily.dev/posts/the-lock-that-killed-my-migration-rpiz4vna3) · The Art of Simplicity · 1 upvotes · 0 comments
- [Help, My Java Object Vanished \(and the GC is Not at Fault\)](https://daily.dev/posts/help-my-java-object-vanished-and-the-gc-is-not-at-fault--t4offx3f4) · Lobsters · 0 upvotes · 0 comments
- [How I Found a Deadlock Inside ART That ART Itself Couldn’t Dump](https://daily.dev/posts/how-i-found-a-deadlock-inside-art-that-art-itself-couldn-t-dump-6nkawyfh2) · ProAndroidDev · 1 upvotes · 0 comments
- [Today I will… debug a production crash](https://daily.dev/posts/today-i-will-debug-a-production-crash-oix9ikedw) · Visual Studio Blog · 11 upvotes · 1 comments

---

Tags: [#.net](https://daily.dev/tags/.net)

[View this post on daily.dev](https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"AccessViolation in ObjectNative::IsLockHeld (part 1 of 2)","url":"https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x"},"datePublished":"2026-10-04T13:06:49.109Z","dateModified":"2026-10-04T13:15:35.598Z","description":"A deep debugging investigation traces an AccessViolationException crashing a .NET application (Orchard CMS) in clr!ObjectNative::IsLockHeld. Using WinDbg on a...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d92900b451afa1fcaca1e8dc51f0ceff?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d92900b451afa1fcaca1e8dc51f0ceff?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Kevin Gosse (minidump.net)","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Kevin Gosse (minidump.net)","logo":"https://media.daily.dev/image/upload/s--8KHn1aFB--/f_auto,q_auto/v1791119046/logos/minidump?_a=BAMAMicg0","url":"https://daily.dev/sources/minidump"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":".net","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Kevin Gosse (minidump.net)","item":"https://daily.dev/sources/minidump"},{"@type":"ListItem","position":3,"name":"AccessViolation in ObjectNative::IsLockHeld (part 1 of 2)"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/accessviolation-in-objectnative-islockheld-part-1-of-2--1xtouvn4x#faq","mainEntity":[{"@type":"Question","name":"What is the sync block table in the .NET CLR and when does an object use it instead of a thin lock?","acceptedAnswer":{"@type":"Answer","text":"The sync block table stores extended locking and hashcode information for objects when the 4-byte object header runs out of room. This happens when a lock is contended (multiple threads waiting) or when GetHashCode is called on the object, since the hashcode must be stable even though object addresses can move during garbage collection. The object header then stores an index into this table instead of the lock data directly. Developers tracking down CLR lock corruption bugs can find deep debugging writeups like this on daily.dev."}},{"@type":"Question","name":"How do I resolve native stack frame addresses to managed method names in a WinDbg crash dump?","acceptedAnswer":{"@type":"Answer","text":"Use the ip2md command with the raw address from the native stack trace, for example !ip2md 0x00007ffb064c776f. WinDbg returns the MethodDesc, method name, class, method table, and JIT status, letting you map opaque addresses like clr!ObjectNative::IsLockHeld+0x4d back to a specific managed method such as Orchard.OutputCache.Filters.OutputCacheFilter.Dispose(Boolean). Anyone untangling native .NET crash dumps can browse similar WinDbg troubleshooting walkthroughs on daily.dev."}},{"@type":"Question","name":"Why would Monitor.IsEntered crash with an AccessViolationException in a .NET Framework application?","acceptedAnswer":{"@type":"Answer","text":"Monitor.IsEntered calls Monitor.IsEnteredNative, mapped internally to clr!ObjectNative::IsLockHeld, which reads the object's sync block to check lock ownership. A crash there with a register value of 0xffffffffffffffff indicates the sync block table or the object header holding the sync block index was corrupted before IsLockHeld was ever invoked, since the function only reads memory and performs no writes. Teams chasing elusive lock-related crashes in .NET services can find investigative deep dives like this on daily.dev."}}]}
```

