a.exe
b.dll
c.exea.exe 调用b.dll里的sethook函数hook c.exe一切都正常,包括b.dll的 sethook函数 也都可以正常调试
但是b.dll里的回调函数里设置断点后,并无法中断
b.dll里设置AfxMessageBox 倒是可以弹出窗口这个如果调试dll里的回调函数???

解决方案 »

  1.   

    不知道你用的什么样的IDE。首先我们要了解,如果想在程序里设置断点,那么必须得有对应程序的符号表。我估计你的a.exe和b.exe不在同一个solution里,你是在a.exe的工程里面执行了a.exe,然后又在b.dll的工程里面打的断点。这样debug的时候,调试器找不到b.dll的符号表,就无法中断。
    这里就以VS举例吧。如果a.exe与b.dll不在同一个Solution里面:
    打开b.dll这个工程,点击调试。因为b.dll是不可以直接执行的,此时,VS会让你选择一个可以执行的会用到b.dll的资源的应用程序。那么就选择a.exe.这个时候a.exe开始执行,在b.dll里面设置的断点就可以中断了。如果a.exe与b.dll在同一个Solution里面:
    就比较简单了,直接执行a.exe就可以在b.dll的souce里面追踪断点了。
      

  2.   

    你hook的c.exe 因此 b.dll的运行空间在c.exe里面,与a.exe中的运行空间是不同的两份。你在你在回调函数里面调用 DebugBreak 或者内嵌汇编 int 3;  就能验证这个问题了。
      

  3.   

    实在不行就通过output窗口输出调试信息吧
      

  4.   

    试下用b.dll的工程启动,启动参数设置成a.exe
      

  5.   

    设置b.dll 为启动项目,a.exe 为参数
      

  6.   

    所以我问你调试的时候是运行的哪个工程啊。如果你是在a.exe这个工程里面运行,虽然断点是打在b.dll包括的回调函数里面,但是这个断点是无法被a.exe的调试器捕获到的。hotpos和playstudy说的也就是这个意思。你得以b.all为启动项目,a.exe为参数。
      

  7.   

    trace 是没法显示的
    估计可能是dll已经注入到c.exe中了,导致没法获取该信息
      

  8.   

    所以我问你调试的时候是运行的哪个工程啊。如果你是在a.exe这个工程里面运行,虽然断点是打在b.dll包括的回调函数里面,但是这个断点是无法被a.exe的调试器捕获到的。hotpos和playstudy说的也就是这个意思。你得以b.all为启动项目,a.exe为参数。
    -----------------------------------------------------
    调试的时候就是以dll工程启动。a.exe为参数的
      

  9.   

    符号文件路径是写在二进制可执行文件里面的,不存在跨solution的问题。调试的时候请c.exe 启动调试b.dll的工程。简单点,在你的回调函数开头加一行 DebugBreak();等触发调试事件的时候,再用VS附加就行了。