2010-01-20 69 views
2

我遇到了麻煩,我從其他開發人員(意味着我真的不知道太多的代碼)接管了一個asp.net 2.0應用程序。它拋出一個未處理的異常,但我無法得到任何源信息,在那裏發生了異常,並且通過源代碼的調試突然終止,顯示反彙編代碼的唯一選項。asp.net VS2005調試問題

在VS2005或IIS中,我還能做什麼來確定發生異常的位置?

下面是IIS錯誤消息(通常顯示源文件,行號等,但在這種情況下不)的輸出。

謝謝。

String or binary data would be truncated. 
The statement has been terminated. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: String or binary data would be truncated. 
The statement has been terminated. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 


[SqlException (0x80131904): String or binary data would be truncated. The statement has been terminated.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1950890 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4846875 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392 
    System.Data.SqlClient.SqlDataReader.SetMetaData(_SqlMetaDataSet metaData, Boolean moreInfo) +125 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1908 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +83 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10 
    System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130 
    System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +287 
    System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +92 
    System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1297 
    System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +19 
    System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142 
    System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 
    System.Web.UI.WebControls.GridView.DataBind() +4 
    System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 
    System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +72 
    System.Web.UI.Control.EnsureChildControls() +87 
    System.Web.UI.Control.PreRenderRecursiveInternal() +44 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Control.PreRenderRecursiveInternal() +171 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842 




-------------------------------------------------------------------------------- 
Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 
+0

澄清:我知道SQL錯誤消息的含義。我只是不知道它來自哪裏。在應用程序中加載其中一個頁面時會發生錯誤 - 所有其他頁面都可以正常工作。當在VS中進行調試時,它會在頁面的Page_Load()關閉後立即切換到程序集視圖,因此我不知道錯誤來自哪裏。 – Tom 2010-01-20 16:07:33

回答

1

問題可能是VS本身。在過去遇到這樣的問題時,我的問題有時會在VS重新啓動或重新啓動時消失。假設沒有幫助:

我的猜測是,VS可能是好的,而你使用的數據訪問層(DAL)是問題所在。它似乎試圖處理這個錯誤,但沒有做出很好的工作。我無法從堆棧跟蹤中得知,但是您是否爲您引用另一個.NET庫DAL或使用第三方DAL?在第一種情況下,您應該可以運行該程序,輸入中斷點,然後運行頂級代碼。你應該能夠打破你的斷點。如果這是第三方DAL,那將不起作用。

如果你根本無法通過您的DAL執行代碼,那麼你必須:

  1. 分析堆棧跟蹤,並嘗試拼湊發生了什麼。您對堆棧跟蹤中的第一行有一個很好的線索:有些東西試圖將數據太大而導致數據結構太小。如果這是一個寫入的過程,那麼這個東西太小可能是數據庫中的一個字段 - 比較你正在使用的數據和它發生的地方。如果這是一個讀取進程,那麼太小的事情是一箇中間的SQL UDF或過程。
  2. 使用SQL Server Profiler查看究竟發生了什麼。 (當然,這裏假設你使用的是SQL服務器。)如果你之前沒有使用過該工具,那麼現在是開始的好時機。它可以讓你解決這樣的問題。即使使用具有良好錯誤處理的代碼,該工具也適用於生產問題。使用Profiler,您將能夠看到發生的sql操作,並查看錯誤發生的位置。
+0

DAL代碼包含在項目中,也設置爲在調試模式下編譯。而調試器仍在逐步執行代碼,它實際上也進入了DAL源代碼,而不是在發生異常時。我將開始瀏覽DAL代碼以查看那裏的斷點是否有幫助,並且還可以在服務器分析器上進行閱讀。這可以遠程運行,因爲我可能無法直接訪問sql server計算機。 – Tom 2010-01-20 16:28:02

+0

Profiler絕對可以遠程運行。如果您的計算機上安裝了SQL Server客戶端工具,您可能會擁有它。唯一的潛在問題是,如果你有DB納粹分子懷疑地問「你爲什麼需要這個?這是我們的工作。」或者誰不會爲您提供跟蹤權限。 – 2010-01-20 16:38:27

+0

「只有」花了我半天的時間纔得到所需的跟蹤權限..它真的幫助了很多。跟蹤我很快發現特定的存儲過程是原因(將變量字段聲明爲太小的varchar,因此爲截斷錯誤消息)。 所以感謝與探查技巧 - 現在我想知道爲什麼我從來沒有使用過;) – Tom 2010-01-21 16:12:03

1

此錯誤表明您嘗試在大於列最大長度的表中插入列中的值。例如,您將列的最大長度指定爲20,並且您嘗試插入的字符串大於20個字符。

2

那麼,那個錯誤信息看起來很熟悉。 您正試圖插入對數據庫中的列太大的值。它可以是一個字符串或一個數字或別的東西。但是,您必須能夠根據錯誤觸發時的處理方式來判斷。

爲了調試正在發生的事情,您需要轉到Debug - > Attach to process。並選擇所有w3wp.exe進程(看到它們你可能需要勾選「顯示所有用戶的進程」和「顯示所有進程的進程」)。此外,您需要確保您的網站構建在調試版本配置中,而不是版本中。

希望它可以幫助

+0

不幸的是沒有w3wp.exe進程。開發機器是xp sp3,iis5,vs2005sp1。 – Tom 2010-01-20 16:15:21

1

這兩條線:

System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1297 
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +19 

表明網頁與SELECT語句一個SqlDataSource,它是SELECT語句導致錯誤。

+0

感謝您的信息。我希望明天能夠在sql服務器上獲得跟蹤權限,以便我可以嘗試找出正在運行的查詢。在此期間:SELECT如何導致截斷錯誤消息?我認爲它只適用於數據庫寫入... – Tom 2010-01-20 22:25:07

+0

僅僅因爲它是連接到數據源的Select語句,並不意味着它是'SELECT * FROM Table'。它可能是一個存儲過程,它會執行一堆其他的東西(比如插入日誌信息)。 – 2010-01-20 22:44:22