Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: uglyangel   发起时间: 2012-09-17 20:15 下午   回复: 4

Print Search
帖子排序:    
   2012-09-17, 20:15 下午
uglyangel 离线,最后访问时间: 2016/5/21 11:16:32 uglyangel

发帖数前100位
男
注册: 2009-11-14
天津
发 贴: 11
如何查看struct的元素值
Reply Quote
1.测试代码片段
typedef struct tagSTRCT_TEST
{
int m_iInt;
std::string m_strString;
}STRCT_TEST;
void Cwindbg_trainingDlg::OnBnClickedButton7()
{
// TODO: Add your control notification handler code here
STRCT_TEST st;
st.m_iInt = 2;
st.m_strString = "aaa";
st.m_iInt++;
st.m_strString = "bbb";
__asm int 3;
}

2.调试过程
0:000> kb
ChildEBP RetAddr  Args to Child              
0012f87c 004081d2 00553cd0 0012fe68 0012f8bc windbg_training!Cwindbg_trainingDlg::OnBnClickedButton7+0x64 [e:\工作资料\交通培训\windbg_training\windbg_training\windbg_trainingdlg.cpp @ 296]
0012f88c 004083e1 0012fe68 000003ee 00000000 windbg_training!_AfxDispatchCmdMsg+0x45 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 82]
0012f8bc 00407950 000003ee 00000000 00000000 windbg_training!CCmdTarget::OnCmdMsg+0x11c [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 381]
0012f8e0 0040f453 000003ee 00000000 00000000 windbg_training!CDialog::OnCmdMsg+0x1d [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 85]
0012f930 0040fdad 00000000 00240520 6c498dc8 windbg_training!CWnd::OnCommand+0x92 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2363]
0012f9cc 0040bb1e 00000111 000003ee 00240520 windbg_training!CWnd::OnWndMsg+0x36 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1769]
0012f9ec 0040eaea 00000111 000003ee 00240520 windbg_training!CWnd::WindowProc+0x24 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1755]
0012fa54 0040eb79 00000000 002d04f0 00000111 windbg_training!AfxCallWndProc+0x9a [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 240]
0012fa74 77d18734 002d04f0 00000111 000003ee windbg_training!AfxWndProc+0x36 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 402]
0012faa0 77d18816 0040eb43 002d04f0 00000111 USER32!InternalCallWinProc+0x28
0012fb08 77d2927b 00000000 0040eb43 002d04f0 USER32!UserCallWinProcCheckWow+0x150
0012fb44 77d292e3 00835ef8 00827d00 000003ee USER32!SendMessageWorker+0x4a5
0012fb64 771a735f 002d04f0 00000111 000003ee USER32!SendMessageW+0x7f
0012fb84 771a7441 001827a8 00000000 00110077 COMCTL32!Button_NotifyParent+0x3d
0012fba0 771a9746 001827a8 00000001 0012fc98 COMCTL32!Button_ReleaseCapture+0xd7
0012fc30 77d18734 00240520 00000202 00000000 COMCTL32!Button_WndProc+0x887
0012fc5c 77d18816 771a8ebf 00240520 00000202 USER32!InternalCallWinProc+0x28
0012fcc4 77d189cd 00000000 771a8ebf 00240520 USER32!UserCallWinProcCheckWow+0x150
0012fd24 77d18a10 00176328 00000000 0012fd58 USER32!DispatchMessageWorker+0x306
0012fd34 77d274ff 00176328 77d2aeab 0012fe68 USER32!DispatchMessageW+0xf
0:000> dv
           this = 0x0012fe68
             st = struct tagSTRCT_TEST
0:000> dt st
Local var @ 0x12f84c Type tagSTRCT_TEST
   +0x000 m_iInt           : 3
   +0x004 m_strString      : std::basic_string<char,std::char_traits<char>,std::allocator<char> >
0:000> !stl m_strString
Failed to find GetSymbolTypeId( m_strString, ... ), hr =0x80004005

3.问题
怎么获得m_strString的值?

baidu,google未果,求解,先谢过!



IP 地址: 已记录   报告
   2012-09-17, 22:10 下午
uglyangel 离线,最后访问时间: 2016/5/21 11:16:32 uglyangel

发帖数前100位
男
注册: 2009-11-14
天津
发 贴: 11
Re: 如何查看struct的元素值
Reply Quote
这样貌似可以:
0:000> dt st -r
Local var @ 0x12f84c Type tagSTRCT_TEST
   +0x000 m_iInt           : 3
   +0x004 m_strString      : std::basic_string<char,std::char_traits<char>,std::allocator<char> >
      +0x000 _Alval           : std::allocator<char>
      =00553cd8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::npos : 0xffffffff
      +0x004 _Bx              : std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
         +0x000 _Buf             : [16]  "bbb"
         +0x000 _Ptr             : 0x00626262  "--- memory read error at address 0x00626262 ---"
      +0x014 _Mysize          : 3
      +0x018 _Myres           : 0xf
问题是怎么能单独显示m_strString的值?

IP 地址: 已记录   报告
   2012-10-22, 19:01 下午
Levwz 离线,最后访问时间: 2012/7/24 13:20:47 悬崖遛马

发帖数前25位
注册: 2012-07-24
发 贴: 30
Re: 如何查看struct的元素值
Reply Quote
显示值是什么意思? “bbb” 或者 “aaa” 么

如果是的话  有个命令 poi 以及 du/da应该对你有用

IP 地址: 已记录   报告
   2012-10-22, 21:53 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 如何查看struct的元素值
Reply Quote

可以用C++表达式,然后用C++的语法,比如:

0:000> ?? this->m_dwMemBytes
unsigned long 0x320


IP 地址: 已记录   报告
   2012-10-23, 13:00 下午
uglyangel 离线,最后访问时间: 2016/5/21 11:16:32 uglyangel

发帖数前100位
男
注册: 2009-11-14
天津
发 贴: 11
Re: 如何查看struct的元素值
Reply Quote
谢谢张老师及悬崖遛马!C++表达式确实可以,stl封装的数据结构其实也是类,比如vector:
1.??this->m_vecStrB._Mylast-this->m_vecStrB._Myfirst,可以获得vector的size;
2.用ebx清0做一下循环标志;
3..while(@ebx < 4){??this->m_vecStrB._Myfirst[@ebx]._Bx;r @ebx = @ebx+1},就可以打印每个元素的值;
4.恢复ebx。
能有类似于!stl的扩展命令就好了,试了下sdbgext,不好用。。。

再次感谢两位老师的指点!

附:
//测试代码
void Cwindbg_sampleDlg::OnBnClickedBtnStl()
{
// TODO: Add your control notification handler code here
std::string strTemp = "a joking";
std::vector<std::string> vecStrTem;
vecStrTem.push_back("a");
vecStrTem.push_back("b");

m_iD = 2012;
m_strA = "this is a sample";
m_vecStrB.push_back("this");
m_vecStrB.push_back("is");
m_vecStrB.push_back("a");
m_vecStrB.push_back("sample");

m_vecIntC.push_back(1);
m_vecIntC.push_back(2);
m_vecIntC.push_back(3);
__asm int 3;
}

//输出结果:
0:000> .while(@ebx < 4){??this->m_vecStrB._Myfirst[@ebx]._Bx;r @ebx = @ebx+1}
union std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
   +0x000 _Buf             : [16]  "this"
   +0x000 _Ptr             : 0x73696874  "--- memory read error at address 0x73696874 ---"
union std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
   +0x000 _Buf             : [16]  "is"
   +0x000 _Ptr             : 0xba007369  "--- memory read error at address 0xba007369 ---"
union std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
   +0x000 _Buf             : [16]  "a"
   +0x000 _Ptr             : 0xbaad0061  "--- memory read error at address 0xbaad0061 ---"
union std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
   +0x000 _Buf             : [16]  "sample"
   +0x000 _Ptr             : 0x706d6173  "--- memory read error at address 0x706d6173 ---"



IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 如何查看struct的元素值

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.