Windbg Script---从.NET应用程序检索查询/存储过程
好的,假如正在调试一个.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>\nClick on the queries/stored procedures below to get more details and to find out the threads using it.\n\n</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>\n\n", 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>\n\n", poi(${obj}+0x14)+0xc } .if(0 = @$t1) { .printf /D "<b>\nNo SQL commands found.\n</b>" }
为虫子生,为虫子死,为虫子奋斗一辈子