to index
  • IDE 调试 dbg
  • 调试 构造函数
  • 调试 c#
  • pdb
  • pdb load
  • 确定应该加载的pdb和相应的文件
  • 加载符号太慢
  • release 调试
  • dll 调试
  • C# - cpp dll调试:
  • watcher 窗口
  • 类函数副本不一致
  • lv1=ide lv2= type=jy
    IDE 调试 dbg
    〖经验 debug〗
    typedefvoid (*PTest)(HWNDmainWnd);
    PTest(null);--可以编译通过.但导致不能调试
    i:\wke\wke_1.0\Source\WebCore\bindings\js\JSMainThreadExecState.h 不能进入-重编ok

    调试 构造函数

    line159表示进入了构造函数,但在执行如何语句之前会调用基类/初始化列表的构造函数.即到达160断点前还可以有其他断点.
    openprj: openexeanddebugit

    调试 c#

    test111depon MyControl,虽然mycontrol没有加载到当前sln中,但仍然可以正常编译调试.
    core.dll can't be debug: 先确保在编辑mycontrolsln中可以调试,确定使用的dll&pdb,copy到使用的项目再试

    pdb

    pdb中记录的路径为绝对路径.
     .lib中记录了.pdb的绝对路径,默认为vc90.pdb,可以修改.
     在链接.liblinker先确定文件名,如vc80.pdb,会在lib的同级目录下或lib中记录的绝对路径中寻找,如果找不到则报以下warning:
    1>libjpeg.lib(jcprepct.obj) : warning LNK4099: 未找到PDBvc80.pdb(使用K:\chrome\chrome8_2\src\chrome\Debug\lib\libjpeg.lib或在K:\chrome\chrome8_2\src\third_party\WebKit\vs2008\Debug_Cairo_CFLite\vc80.pdb中寻找);正在链接对象,如同没有调试信息一样
    pdb如果不能load,删除.suo,重启ide
    pdb输出name:c++>输出文件>程序数据库文件名

    pdb load

    msserver上下载后再次调试还是不能找到pdb:查看器搜索路径,eg:
    C:\Windows\SysWOW64\wkernel32.pdb: Cannot find or open the PDB file.
    I:\work\wke\wkernel32.pdb: Cannot find or open the PDB file.
    E:\Symbols_ms\symbols\dll\wkernel32.pdb: Cannot find or open the PDB file.
    将其copy到某个搜索路径即可.
    ---------------------------------
    让Visual Studio载入Symbol(pdb)文件
    http://blog.csdn.net/xt_xiaotian/archive/2010/03/16/5384111.aspx
    e:\symbols
     	[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
    ---------------------------------
    pdbload的可能输出:
    'TestCMain.exe': Loaded 'X:\project\cpp\TestDll\Debug\TestCMain.exe', Symbols loaded.
    'TestCMain.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Symbols loaded (source information stripped).
    'TestCMain.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Symbols loaded (source information stripped).
    'TestCMain.exe': Loaded 'X:\project\cpp\TestDll\Debug\TestDll.dll', Symbols loaded.
    test_shell.exe: 已加载R:\VCall.dll,未使用调试信息生成二进制文件seebelow
    ---------------------------------
    test_shell.exe: 已加载R:\VCall.dll,未使用调试信息生成二进制文件
    1>zbase.lib(mem.obj) : warning LNK4075: 忽略/EDITANDCONTINUE(由于/INCREMENTAL:NO规范)
    vs2005 未使用调试信息生成二进制文件 解决
    首先打开菜单 项目->项目属性页
    1。选择 配置属性->链接器->调试->生成调试信息 改为 是
    2。选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于编辑并继续的程序数据库(/ZI)
    3。选择 配置属性->C/C++ ->优化->优化 改为 禁用(/Od)
    engversion:
    1   项目属性,configuration properties->linker->Generate Debug Info 从 no 改为 yes
    2   项目属性,configuration properties->c/c++->debug information format为/ZI
    3   项目属性,configuration properties->c/c++->optimization为Disabled
    项目属性从lib改为dll,也能导致不生pdb.

    确定应该加载的pdb和相应的文件

    lib中记录了pdb的绝对路径,而pdb中又记录了文件的绝对路径,所以使用编译好的lib容易造成调试的文件不是当前项目中的文件.
    确定可以dbg? no, wke.pdb没有加载,dll加载的断点需要此pdb,而不是exepdb

    加载符号太慢

    test_shell.dll 加载符号太慢: test_shell2.pdb--renamebigpdbs.
    删除suo文件(可能由于禁用disable is造成)

    release 调试

    以及去掉优化.

    dll 调试

    项目设置:(Debugging),设置command, arg, workingdir(即为快捷方式中的起始位置)
    Q:\es0.6\bin\java.exe
    -Xms64m -Xmx256m -Dfile.encoding=GB2312 -verbose:gc -cp log4j-1.2.8.jar;js.jar;bsh-2.0b4.jar;. zmyth.xlib.Start start.dat
    Q:\es0.6
    bin\df.exe
    -Xss2m -Xms128m -Xmx512m -Dfile.encoding=GB2312 -verbose:gc -cp . zmyth.xlib.Start data/start.dat tcp://122.11.61.155:8610 0.80.06131 a!b
    L:\东方故事--0.8版本_2

    C# - cpp dll调试:

    还有clrsupport
    确认C# 项目引用了cpp项目
    最后再rebuild
    CppUtil, zbase, compresslib 需要一起加载,才能保证rebuildall通过.

    watcher 窗口

    5,wm
    @err,hr
    data,5
    断点:在函数处中断
    http://msdn.microsoft.com/zh-cn/library/k7xkk3e2(v=vs.80).aspx

    类函数副本不一致

    全局函数的定义不要写在.h中,但是类的函数却可以〖cpp basic knowledge
    see X:\project\win32\ExpmtWin32 v280 (需要两个lib项目)
    ClassMethonTest.h:
    classClassMethodTest
    {
    public:
    ClassMethodTest(inta)
    	{
    printf("in ClassMethodTest's ctor(), a = %d\n", a);
    	}
    voidUsedBy1()
    	{
    printf("Used by 1\n");
    	}
    voidUsedBy2()
    	{
    printf("Used by 2\n");
    	}
    };
    ExpmtWin32Lib.vcproj(lib1) & ExpmtWin32Lib2.vcproj(lib2)同时依赖于ClassMethonTest.h,lib1使用了ctor&UsedBy1, lib2使用了ctor&UsedBy2
    lib1并没有导出类ClassMethodTest的所有的method:
    lib1导出(记为ABC):
                   ??0ClassMethodTest@@QAE@H@Z
                   ??_C@_0CF@CGOPMNOL@in?5ClassMethodTest?8s?5ctor?$CI?$CJ?0?5a?5?$DN@
                   ?UsedBy1@ClassMethodTest@@QAEXXZ
    lib2导出(记为A2B2D2):
                   ??0ClassMethodTest@@QAE@H@Z
                   ??_C@_0CF@CGOPMNOL@in?5ClassMethodTest?8s?5ctor?$CI?$CJ?0?5a?5?$DN@
                   ?UsedBy2@ClassMethodTest@@QAEXXZ
    正常情况下A=A2,B=B2,并且都指向同一个.h文件
    现在只编译lib1,不编译lib2,链接之后为:ABC,D2被使用了,但D2所要求的.h文件已经被修改,因此D2无法调试/设置断点
    这种情况下两个lib导出了相同的符号但却不会报链接错误...
    HTMLToken.h 被多个cpp文件包含,但修改之后只有部分cpp编译文件被(同一个项目也能造成部分可调式的情形):
      html\parser\CSSPreloadScanner.cpp(35):#include "HTMLToken.h"
      html\parser\HTMLConstructionSite.cpp(41):#include "HTMLToken.h"
      html\parser\HTMLTokenizer.cpp(32):#include "HTMLToken.h"
      html\parser\HTMLTreeBuilder.cpp(43):#include "HTMLToken.h"
      html\HTMLViewSourceDocument.cpp(41):#include "HTMLToken.h"