diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index d06c0e21323711a6612b0a159e57d4f815b9ded8..b7dec3cb7fb08469b03f327c7e619fdd18a66b5d 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -82,9 +82,11 @@ const int LL_ERR_NOERR = 0;
 
 #ifdef SHOW_ASSERT
 #define llassert(func)			llassert_always_msg(func, #func)
+#define llassert_msg(func, msg)	llassert_always_msg(func, msg)
 #define llverify(func)			llassert_always_msg(func, #func)
 #else
 #define llassert(func)
+#define llassert_msg(func, msg)
 #define llverify(func)			do {if (func) {}} while(0)
 #endif
 
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 9fb5eef3a25be433c354e61d94ed5cf99898284e..e5e6882ba117c13e91706213abd5c6bc7bba5fe7 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -1363,7 +1363,8 @@ void LLVertexBuffer::setBuffer()
     U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask;
 
     // this Vertex Buffer must provide all necessary attributes for currently bound shader
-    llassert((data_mask & mTypeMask) == data_mask);
+    llassert_msg((data_mask & mTypeMask) == data_mask,
+        "Attribute mask mismatch! mTypeMask should be a superset of data_mask.  data_mask: 0x" << std::hex << data_mask << " mTypeMask: 0x" << mTypeMask << std::dec);
 
     if (sGLRenderBuffer != mGLBuffer)
     {