jamesaskOctober 3, 20108

  • NOTE:  This post has been updated in a new post due to an issue found with the steps in this post.  The procedure is the same, but the steps here may only work with 32 bit dumps.  Please read the post located at the address below:

http://blogs.msdn.com/b/askjay/archive/2011/02/18/finding-which-queries-were-executing-from-a-sql-memory-dump-revisited.aspx

—————————————————————————————————-

In this post, we’ll see how to find out which queries were executing from a SQL Server memory dump.   You might have a dump file from a crash of the SQL Service, or you may have taken a diagnostic dump with sqldumper.

What we do in this post assumes you are working with a full or filtered dump of SQL Server.  For more information on dumping SQL Server, read this post:

http://blogs.msdn.com/b/askjay/archive/2010/02/05/how-can-i-create-a-dump-of-sql-server.aspx

Some of the objects contained in the dump that are needed to completely understand this process can only be resolved with private symbols.  What this means is that to fully track down the executing query text, you need to be internal to MS with access to “private” symbols.

However, after finding the query text with the private symbols, we can quickly get to the query text with public symbols and a few specific memory addresses and offsets.

So first, set your public symbol path:

0:000> .sympath srv*c:\symbols\public*http://msdl.microsoft.com/download/symbols 
Symbol search path is:srv*c:\symbols\public*http://msdl.microsoft.com/download/symbols 
0:000> .reload /f sqlservr.exe

Search the stacks:

0:000> ~* k

You are looking for a stack that is executing a query.  It will look like this:

Call Site

ntdll!ZwWaitForSingleObject+0xa 
KERNELBASE!WaitForSingleObjectEx+0x9c 
sqlservr!SOS_Scheduler::Switch+0xc7 
sqlservr!ThreadScheduler::SwitchNonPreemptive+0xc6 
sqlservr!AutoSwitchPreemptive::~AutoSwitchPreemptive+0x39 
sqlservr!SOS_Task::AutoSwitchPreemptive::~AutoSwitchPreemptive+0x26 
sqlservr!Np::StatusWriteNoComplPort+0xc3 
sqlservr!SNIStatusWriteNoComplPort+0x59 
sqlservr!TDSSNIClient::WriteStatus+0x99 
sqlservr!write_data+0x1bf 
sqlservr!flush_buffer+0xf3 
sqlservr!CKatmaiTds::SendRowImpl+0x19c 
sqlservr!CEs::GeneralEval+0x91f 
sqlservr!CXStmtQuery::ErsqExecuteQuery+0xe3a 
sqlservr!CMsqlExecContext::ExecuteStmts<1,1>+0xb6c 
sqlservr!CMsqlExecContext::FExecute+0x593 
sqlservr!CSQLSource::Execute+0x2f9
 
sqlservr!process_request+0x370 
sqlservr!process_commands+0x2b2
 
sqlservr!SOS_Task::Param::Execute+0x11b 
sqlservr!SOS_Scheduler::RunTask+0xca 
sqlservr!SOS_Scheduler::ProcessTasks+0x95 
sqlservr!SchedulerManager::WorkerEntryPoint+0x110 
sqlservr!SystemThread::RunWorker+0x60 
sqlservr!SystemThreadDispatcher::ProcessWorker+0x12c 
sqlservr!SchedulerManager::ThreadEntryPoint+0x12f 
msvcr80!_callthreadstartex+0x17 [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c @ 348] 
msvcr80!_threadstartex+0x84 [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c @ 326] 
kernel32!BaseThreadInitThunk+0xd 
ntdll!RtlUserThreadStart+0x21

We are interested in the 3rd parameter of the sqlservr!CMsqlExecContext::ExecuteStmts call as seen below:

0e 00000000`0f6eee80 00000000`00e90fe3 : 00000064`00000000

00000001`00000000

00000000`86909380 
00000000`00000000 
: sqlservr!CMsqlExecContext::ExecuteStmts<1,1>+0xb6c

This is the address of an object, and we need to dump 1 dword at an offset of 0x20 into this object:

0:041>

dd 86909380+0x020 l1 
00000000`869093a0  869093e0

The address at this offset into the object is a property that contains a pointer (another address) to the buffer that contains our query text.  So we get our address from here:

0:041>

dd 869093e0 l1 
00000000`869093e0  86909470

Now this is the address we need.  So we dump unicode string on this address and we get our query:

0:041>

du 86909470 
00000000`86909470  "….select * from Sales.SalesOrd
00000000`869094b0  "erHeaderroductLevel’);..a"

You should be able to follow this approach for most threads executing queries.  The signature of the “ExecuteStmts” function (a method of the CMsqlExecContext object) should have the object address we need as the 3rd parameter provided the stack is the same (the method could be overloaded and take something else as the 3rd parameter in a different situation – but I’d have to check).

-Jay

How do I find what queries were executing in a SQL memory dump?-----stack的更多相关文章

  1. The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01

    1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainland. ...

  2. EF: Raw SQL Queries

    Raw SQL Queries Entity Framework allows you to query using LINQ with your entity classes. However, t ...

  3. BZOJ2482: [Spoj1557] Can you answer these queries II

    题解: 从没见过这么XXX的线段树啊... T_T 我们考虑离线做,按1-n一个一个插入,并且维护区间[ j,i](i为当前插入的数)j<i的最优值. 但这个最优值!!! 我们要保存历史的最优值 ...

  4. SPOJ 1557. Can you answer these queries II 线段树

    Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...

  5. [Oracle EBS R12]SQL Queries and Multi-Org Architecture in Release 12 (Doc ID 462383.1)

    In this Document   Abstract   History   Details   Previous Releases   Release 12   Multi-Org Session ...

  6. bzoj 2482: [Spoj GSS2] Can you answer these queries II 线段树

    2482: [Spoj1557] Can you answer these queries II Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 145 ...

  7. SQL Queries and Multi-Org Architecture in Release 12

    In this Document   Abstract   History   Details   Previous Releases   Release 12   Multi-Org Session ...

  8. Code Forces 644B Processing Queries

    B. Processing Queries time limit per test5 seconds memory limit per test256 megabytes inputstandard ...

  9. Light OJ-1082 - Array Queries,线段树区间查询最大值,哈哈,水过~~

                                                                                                        ...

随机推荐

  1. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

  2. 在Github里集成Readthedocs服务

    Readthedocs支持Markdown格式和sphinx格式的文档排版,是部署项目文档的绝佳平台.利用Github的托管服务,我们可以方便地将文档托管于Github,并利用Readthedocs查 ...

  3. HIbernate学习笔记2 之 主键生成方式

    一.hibernate主键生成方式: 1.常用方式:mysql:自增长生成主键(identity) <generator class="identity"> </ ...

  4. hrbust - 2239

    影子模仿术 Time Limit: 500 MS Memory Limit: 32768 K Total Submit: 7(5 users) Total Accepted: 2(2 users) R ...

  5. MapReduce程序的几种提交运行模式

    本地模型运行 1/在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行      ----输入输出数据可以放在本地路径下(c:/wc/ ...

  6. 深度学习方法:受限玻尔兹曼机RBM(一)基本概念

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 最近在复习经典机器学习算法的同 ...

  7. 魔法上网之Ubuntu部署“酸酸”

    “酸酸”,即s*h*a*d*o*w*s*o*c*k*s,用于魔法上网,用python写成. 在ubuntu环境下,用pip包管理工具可以非常方便地安装“酸酸”服务:ssserver. 先安装pip(假 ...

  8. CentOS安装指定版本GCC

    系统是CentOS 7, 自带的gcc是4.8.4 准备工作: 下载GCC源码包 gcc-5.5.0.tar.gz,地址(清华大学开源软件镜像站ipv6)(备选地址->gnu->gcc) ...

  9. nodejs里的express自动刷新gulp-express使用【转载】

    搬运自[http://blog.csdn.net/zhu_free/article/details/51476525] gulp-express实现实时刷新 本来使用gulp-connect可以创建本 ...

  10. 五十九 数据库访问 使用MySQL

    MySQL是Web世界中使用最广泛的数据库服务器.SQLite的特点是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应用.而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也 ...