2013-02-06 5 views
5

일부 배경 : SSMS 2012에서이 메모리 예외가 발생하여 Red Gate의 SQLPrompt와 결합되어 출시되었습니다. 같은 노트북에 SSMS 2008R2).SSMS 2012 System.OutOfMemoryException (클라이언트 쪽) 및 SQL 프롬프트 (디버그 정보 포함)

나는 매일 (SSMS2012 및 SQLPrompt) 이러한 예외 사항이 발생하여 SSMS를 닫고 다시 열도록 강요하고 있습니다. 몇 달 전 나는 가능한 부가 기능을 가리키는 지원 스레드를 우연히 만났습니다. 내 추가 기능 (SQL 프롬프트는 없지만 나머지 개발자 번들을 제거하지 못했습니다)은 없이 System.OutOfMemoryException 예외보다 훨씬 적은 단일 예외입니다.

2012 년 SP1이 릴리스되면 다시 적용하여 SQL 프롬프트를 다시 설치 (최신 버전)하여 문제가 해결되었는지 확인하고 개발 시간이 7 시간 이내에 악명 높은 System.OutOfMemoryException으로 다시 인사했습니다.

이 모든 것을 통해 나는 Red Gate로 티켓을 열고 디버깅 로그를 제출했지만 어디에서 예외가 발생했는지는 알 수 있지만 메모리 예외가 SQLPrompt를 명시 적으로 나열하지 않기 때문에 문제를 개발 팀에 전달하지 않을 것입니다. 그러나이 특정 예외 SQL 프롬프트 전에 SSMS 2012 IDE (Visual Studio 2010) 내에서 여러 가지 예외 (아래 나열된 일부)를 던지고 있습니다. 메모리 예외는 SQL Prompt가 캐시 된 데이터를 관리하는 방법과 결국 SSMS에 대한 사용 가능한 메모리를 사용하여 결국 예외를 throw하는 방식과 관련된 문제의 징후라고 생각합니다.

나는이 문제를 어떻게 재현하는 방법을 연기하며 직접 두 변수와 어떻게 연관되는지를 배울했습니다 :

  1. 연결 및 SSMS의 여러 인스턴스 (Explorer 및 쿼리 창 개체)에서 작동합니다. 나는. 연결 된 7 개의 인스턴스는 2-3 시간 내에 예외를 보냈습니다.
  2. 여러 인스턴스에서 결과 세트를 리턴합니다. 여기에는 SSMS에서 IDE로 정보를 반환하는 데 사용되는 쿼리와 개별 쿼리 창으로 반환 된 결과가 포함됩니다.

SQL 프롬프트가 인스턴스 당 모든 개체 정보를 캐싱하도록 유도하는 예외가 발생하면 더 빨리 연결됩니다. 메모리 예외가 발생하면 SSMS가 완전히 종료 될 때까지 상황이 저하됩니다 (먼저 닫지 않으면).

내가 쓴 것은이 문제를 해결하기 위해 더 나은/더 나은 정보를 레드 게이트에 제출하는 방법입니다. 이것은 내가 당신의 도움이 필요한 곳입니다.

노트북 : HP 엘리트 북 8440은 RAM : 6기가바이트

현재 OS : 여기

System.ArgumentOutOfRangeException "Specified argument was out of the range of valid values." 

Microsoft.VisualStudio.Text.Implementation.BinaryStringRebuilder.GetLineNumberFromPosition(N/A,N/A) 
Microsoft.VisualStudio.Text.Implementation.TextSnapshot.GetLineFromPosition(Microsoft.VisualStudio.Text.Implementation.TextSnapshot,N/A) 
Microsoft.VisualStudio.Editor.Implementation.VsTextBufferAdapter.GetLineIndexOfPosition(N/A,System.Int32,System.Int32&,System.Int32&) 
RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider.PositionFromIndex(RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider,System.Int32) 
RedGate.SqlPrompt.Metadata.Script.ScriptProviderBase.GetText(RedGate.SQLPrompt.CommonVS.Editor.VSScriptProvider,System.Int32,System.Int32) 
RedGate.SqlPrompt.Engine.NewEngine.SqlPromptEngine.GetCandidates(RedGate.SqlPrompt.Engine.NewEngine.SqlPromptEngine,System.Int32) 
RedGate.SqlPrompt.Engine.PromptEngineEmulator.get_GetSuggestions(RedGate.SqlPrompt.Engine.PromptEngineEmulator) 
RedGate.SqlPrompt.Engine.AutoCompleter.m_FilterChanged(RedGate.SqlPrompt.Engine.AutoCompleter,RedGate.SqlPrompt.Engine.PromptEngineEmulator,System.EventArgs) 
RedGate.SqlPrompt.Engine.PromptEngineEmulator.OnFilterChanged(RedGate.SqlPrompt.Engine.PromptEngineEmulator) 
RedGate.SqlPrompt.Engine.PromptEngineEmulator.set_Index(RedGate.SqlPrompt.Engine.PromptEngineEmulator,System.Int32) 
RedGate.SqlPrompt.Engine.PromptEngineEmulator.set_CaretPosition(RedGate.SqlPrompt.Engine.PromptEngineEmulator,N/A) 
RedGate.SQLPrompt.CommonUI.Editor.EditorWindowBase.SetEngineCaretPosition(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow,N/A) 
RedGate.SQLPrompt.CommonUI.Editor.EditorWindowBase.UpdateUIPrompts(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow) 
RedGate.SQLPrompt.CommonVS.Editor.VSEditorWindow.OnTextViewCommandExec(RedGate.SQLPrompt.SSMSUI.SSMSEditorWindow,RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,RedGate.SQLPrompt.CommonVS.Editor.CommandExecEventArgs) 
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.AfterCommandExecute(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,RedGate.SQLPrompt.CommonVS.Editor.CommandExecEventArgs) 
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor..(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.) 
RedGate.SQLPrompt.CommonUI.Utils.ErrorDialog.Do(System.Action) 
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor,System.Guid&,System.Uint32,System.Uint32,System.IntPtr,System.IntPtr) 
RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor..(RedGate.SQLPrompt.CommonVS.Editor.TextViewMonitor.,System.Guid&,System.Uint32,System.Uint32,System.IntPtr,System.IntPtr) 
Microsoft.VisualStudio.Editor.Implementation.CommandChainNode.Exec(N/A,N/A,N/A,N/A,N/A,N/A) 

System.ArgumentException 00:05:14.7510000 "The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))" 

#mMc.#JQub.#OQub(#mMc.#JQub,N/A,System.Uint32,#mMc.#k3ub&) 
#mMc.#JQub.#z26.#8Di(#mMc.#JQub.#z26) 
RedGate.SQLSourceControl.Engine.SmartAssembly.ExceptionReporting.ErrorReporterBase.Do(RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog,System.Action,System.Predicate`1<System.Exception>,System.Boolean) 
RedGate.SQLSourceControl.Engine.SmartAssembly.ExceptionReporting.ErrorReporterBase.Do(RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog,System.Action) 
RedGate.SQLSourceControl.CommonUI.Forms.ErrorDialog.Do(System.Action) 

그리고 : 윈도우 7 엔터프라이즈 에드 SP1을

다음은 SQL 프롬프트에 의해 발생하는 예외의 일부입니다 메모리 예외 :

Exception thrown in result set

다른 예외 관련 여부를하지만 메모리 예외 은 SQL 프롬프트 설치로 발생하는 경우
System.OutOfMemoryException <null> 

System.Text.StringBuilder.set_Capacity(System.Text.StringBuilder,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QEDiskStorageView.set_MaxNumBytesToDisplay(N/A,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QEDiskDataStorage.GetStorageView(N/A) 
Microsoft.SqlServer.Management.QueryExecution.QEResultSet.StartRetrievingData(Microsoft.SqlServer.Management.QueryExecution.QEResultSet,System.Int32,N/A) 
Microsoft.SqlServer.Management.QueryExecution.ResultSetAndGridContainer.StartRetrievingData(N/A,N/A,N/A) 
Microsoft.SqlServer.Management.QueryExecution.ResultsToGridBatchConsumer.OnNewResultSet(Microsoft.SqlServer.Management.QueryExecution.ResultsToGridBatchConsumer,N/A,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.ProcessResultSet(Microsoft.SqlServer.Management.QueryExecution.QESQLBatch,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.DoBatchExecution(Microsoft.SqlServer.Management.QueryExecution.QESQLBatch,System.Data.SqlClient.SqlConnection,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QESQLBatch.Execute(N/A,N/A,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.DoBatchExecution(Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec,Microsoft.SqlServer.Management.QueryExecution.QESQLBatch) 
Microsoft.SqlServer.Management.QueryExecution.QESQLExec.ExecuteBatchCommon(Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec,N/A,N/A,System.Boolean&) 
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.ExecuteBatchHelper(N/A,N/A,N/A,N/A) 
Microsoft.SqlServer.Management.QueryExecution.QEOLESQLExec.ProcessBatch(N/A,N/A,N/A) 
.BatchParser.ThunkCommandExecuter.ProcessBatch(N/A,N/A,N/A) 

은 다시 명확하게하기 위해, 나도 몰라.

도움 주셔서 감사합니다.

+0

[RedGate 포럼] (http://www.red-gate.com/messageboard/index.php)에 더 적합 할 수 있습니다 – Andomar

+1

나에게이 포럼은 레드 게이트 포럼의 수퍼 세트이므로, d 여기에서 고급 도움을 얻을 수있는 더 나은 기회를 얻으십시오. 게다가, 나는 해상도가없는 여러 달 동안 레드 게이트 지원을 해왔습니다. – artofsql

+0

Redgate의 SQLPrompt와 결합 된 2012 SSMS의 사용이이 부서에서 확산됨에 따라이 예외가 있습니다. 이제는 SQLPrompt로 SSMS 2012를 사용하도록 전환 한 피어 DB 개발자가 충돌하고 있습니다. – artofsql

답변

-1

이 게시물에 설명 된대로 열의 수를 제한하고 도움이되는지보십시오. http://redgate.uservoice.com/forums/94413-sql-prompt-feature-suggestions/suggestions/1364757-disable-sql-prompt-on-certain-databases

+0

나는 과거에는 캐싱을 제한하고 비활성화하려고 시도했지만 예외는 그때까지 멈추지 않았습니다. – artofsql

+0

이 제안에 대한 또 다른 문제점은 내가 작업 할 데이터베이스와 서버를 알지 못한다는 것입니다. 따라서이 설정을 계속 유지하려면이 설정을 지속적으로 마이크로 관리해야합니다. 도구가 전문 데이터베이스 도구를 판매 한 경우 실제 데이터베이스 전문가가 SSMS를 끊임없이 중단 할 때이를 사용하지 못합니다. – artofsql

0

SQL 프롬프트에서 코드 제안 사용 안 함을 설정하면 동일한 쿼리를 실행 한 다음 결과를 얻을 수 있습니다. 그런 다음 SQL 프롬프트에서 코드 제안을 활성화 할 수 있으며 잠시 동안 오류가 사라집니다.

0

이 시점에서 RedGate는 최종적으로 SQL Prompt 플러그인이 32 비트 SSMS 클라이언트와 함께 진행 중이며 결국 메모리 부족으로 인해 메모리 부족 문제가 발생한다는 문제점을 인정했습니다.

연간 수정액을 지불 할 때 "아마"1 년 정도면 답변을 얻을 수 있습니다. 얼굴을 때리는 것입니다. 나는이 문제를 해결하기 전까지 2012 년 이후로이 문제와 관련하여 2 개의 기존 툴 - 벨트 라이센스에 대한 추가 지원 비용을 거부했다. 이 문제가 귀하에게 영향을 미치거나 가능하다면 귀하의 지갑으로 투표하여이 수정본을 더 높은 우선 순위로 만들 수 있도록 동기를 부여하십시오.

그 날이 오면이 대답 게시판을 SSMS.exe의 32 비트 메모리 공간에서 더 이상 작동하지 않는 수정 된 SQL 프롬프트 빌드 버전 정보로 업데이트합니다.