好的,假如正在调试一个.NET应用程序。您需要找出从访问数据库的线程执行的查询和存储过程,但是您不知道如何。好消息!这已经不是问题了!此脚本显示与SQLCommand或OracleCommand对象关联的所有查询或存储过程。此外,您可以单击它以获取更多详细信息和使用它的线程。。
以下是截图:
Source code for GET_SQLCOMMAND.TXT:
$
$$
$$ =============================================================================
$$ It shows the SQL commands from a .NET application. It gives you detailed information
$$ and the threads using the query/stored procedure you selected.
$$ Useful for Oracle and SQL Server.
$$
$$ Compatibility: Win32.
$$
$$ Usage: Use $$>< to run the program.
$$
$$ Requirements: Public symbols.
$$
$$ If necessary change the filename below to include your path and filename.
$$ By default it uses the WinDbg path and the default file name is GET_SQLCOMMAND.TXT
$$
$$ Roberto Alexis Farah
$$ Blog: http://blogs.msdn.com/debuggingtoolbox/
$$
$$ All my scripts are provided "AS IS" with no warranties, and confer no rights.
$$ =============================================================================
$$
ad /q *
r @$t0 = 0
r @$t1 = 0
.printf /D "<b>
Click on the queries/stored procedures below to get more details and to find out the threads using it.
</b>"
.block
{
.block
{
as ${/v:ScriptName} MYSCRIPTS\GET_SQLCOMMAND.TXT
}
.block
{
as SQLCommand .block
{
!DumpObj poi(@$t0+0x10)
!DumpObj @$t0
!GCRoot @$t0
}
}
.block
{
as OracleCommand .block
{
!DumpObj poi(@$t0+0x14)
!DumpObj @$t0
!GCRoot @$t0
}
}
}
.foreach(obj {!dumpheap -short -type System.Data.SqlClient.SqlCommand } )
{
r @$t1 = 1
.printf /D "<link cmd="r @$t0 = ${obj}; ${SQLCommand} ;ad ${/v:ScriptName}; $$><${ScriptName}"><b>%mu</b></link>
", poi(${obj}+0x10)+0xc
}
.foreach(obj {!dumpheap -short -type System.Data.OracleClient.OracleCommand } )
{
r @$t1 = 1
.printf /D "<link cmd="r @$t0 = ${obj}; ${OracleCommand} ;ad ${/v:ScriptName}; $$><${ScriptName}"><b>%mu</b></link>
", poi(${obj}+0x14)+0xc
}
.if(0 = @$t1)
{
.printf /D "<b>
No SQL commands found.
</b>"
}