精华内容
下载资源
问答
  • 多进程调试
    千次阅读
    2018-12-31 12:17:32

    在逆向过程中,往往碰到多进程的调试情况,这个时候该如何处理呢?

    一、dnspy 多进程调试

        1.1  当子进程起来后,另外起dnpsy使用附加的方式,可以进入调试。

    这样做是可以调试,但是这样看手速... 如果你附加过慢,可能关键函数已经跳过了;最主要的问题是如果使用dnspy的附加功能,很多函数的局部变量显示不出值,提示:进程不安全;这时,我们应该选择方式1.2。

     

        1.2  dnspyA启动调试主进程,到起进程ProcessStart处断下来,这时可以见到,第一个参数是子进程名,第二个参数是启动参数;     我们再启动一个dnspyB,按照这个启动参数启动,子进程即可;

        注意:启动参数需要修改:去掉头尾的字符串,"""" 改为 "" , \  改为 \\ ;

     

    二、OD的多进程调试

       其实和dnspy的差不多。

     

    更多相关内容
  • GDB多进程调试

    2022-04-10 17:09:51
    使用GDB调试的时候,GDB 默认只能跟踪一一个进程,可以在fork 函数调用之前,通过指令设置GDB调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。 1.设置调试进程或者子进程: set follow- fork-mode [parent ...

    使用GDB调试的时候,GDB 默认只能跟踪一一个进程,可以在fork 函数调用之前,通过指令设置GDB调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。

    1.设置调试父进程或者子进程: set follow- fork-mode [parent (默认)| child]

    可使用        show follow- fork-mode        查看当前默认调试进程

    2.设置调试模式: set detach-on-fork [on | off]
    默认为on, 表示调试当前进程的时候,其它的进程继续运行,如果为off, 调试当前进程的时候,其它进程被GDB挂起。

    可使用         ​​​​​​​show detach-on-fork         查看当前调试模式

    3.查看调试的进程: info inferiors

    查看当前调试的进程信息,如图所示。

    4.切换当前调试的进程: inferior id (id为info输出的num,而不是进程号)

     如图,此时*显示,已经切换到2号进程。

    5.使进程脱离GDB调试:detach inferiors id

     脱离后显示,父进程已运行完毕。

    展开全文
  • CEF之多进程调试

    千次阅读 2021-01-14 14:03:48
    CEF3 使用多进程。其中包括:一个浏览器进程、一个渲染进程和若干其他进程(处理插件的进程、处理GUP的进程等)。 浏览器进程处理窗口的创建和绘制,以及网络访问等,浏览器进程包含了应用程序的主要逻辑。 渲染...

    CEF3 使用多进程。其中包括:一个浏览器进程、一个渲染进程和若干其他进程(处理插件的进程、处理GUP的进程等)。

    • 浏览器进程处理窗口的创建和绘制,以及网络访问等,浏览器进程包含了应用程序的主要逻辑
    • 渲染进程负责渲染 HTML 以及执行 JavaScript ,访问 DOM 等
    • 其他进程则进行插件处理,GPU 处理等(如果有的话)。
    • 多个进程之间通过 IPC (Inter-Process Communication) 通信

    首先启动浏览器进程(Browser),然后启动渲染进程(Render),再启动其他进程。

    默认情况下 CEF3 使用一个 exe 的多个实例来实现上述的多个进程。比如在 CEF3:用CEF3实现最简单的浏览器 中,在 WinMain 开始时会执行下面的代码:

        // CEF applications have multiple sub-processes (render, plugin, GPU, etc)
        // that share the same executable. This function checks the command-line and,
        // if this is a sub-process, executes the appropriate logic.
        int exit_code = CefExecuteProcess(main_args, NULL, NULL);
        if (exit_code >= 0)
        {
            // The sub-process has completed so return here.
            return exit_code;
        }

    这里 CefExecuteProcess() 会根据不同的命令行参数来执行不同的进程如果是浏览器进程,该函数立即返回,返回值为 -1如果是其他进程,则在浏览器退出时才返回,返回值是一个大于0的数。
    运行结果如下图,可以看到同一个 exe 运行了三个实例。
    这里写图片描述

    也可以通过设置 CefSettings.browser_subprocess_path 来以不同的 exe 实现 CEF 的多个进程。下面通过示例说明这一点。

    创建两个工程,一个命名为 BrowserProcess 作为浏览器进程,另一个命名为 BrowserSubProcess 作为其他子进程。工程的设置可以参见 CEF3:用CEF3实现最简单的浏览器

    在 BrowserProcess 工程下创建 main.cpp,编写如下代码。注意这里不再调用 CefExecuteProcess(),而是设置 CefSettings.browser_subprocess_path 的值来指定子进程路径。

    #include "include/cef_app.h"
    #include "include/cef_browser.h"
    #include "include/cef_client.h"
    #include "include/wrapper/cef_closure_task.h"
    #include "include/wrapper/cef_helpers.h"
    #include <Windows.h>
    
    class MyClient : public CefClient, public CefLifeSpanHandler
    {
    public:
        virtual ~MyClient() {}
        virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() override { return this; }
        virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override { CefQuitMessageLoop(); }
    private:
        IMPLEMENT_REFCOUNTING(MyClient);
    };
    
    class MyApp : public CefApp, public CefBrowserProcessHandler
    {
    public:
        virtual ~MyApp() {}
        virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() override { return this; }
        virtual void OnContextInitialized() override 
        {
            CEF_REQUIRE_UI_THREAD();
            CefWindowInfo window_info;
            window_info.SetAsPopup(NULL, "cefsimple");
            CefRefPtr<MyClient> client(new MyClient());
            CefString url = "http://www.baidu.com";
            CefBrowserSettings browser_settings;
            CefBrowserHost::CreateBrowser(window_info, client, url, browser_settings, NULL);
        }
    private:
        IMPLEMENT_REFCOUNTING(MyApp);
    };
    
    int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
    {
        CefMainArgs main_args(hInstance);
        CefSettings settings;
        settings.no_sandbox = true;
        // 获取子进程路径
        WCHAR subProcessPath[MAX_PATH] = { 0 };
        GetModuleFileNameW(hInstance, subProcessPath, MAX_PATH);
        *(wcsrchr(subProcessPath, L'\\') + 1) = L'\0';
        LPCWSTR SUB_PROCESS_NAME = L"BrowserSubProcess.exe";
        wcsncat_s(subProcessPath, MAX_PATH, SUB_PROCESS_NAME, wcslen(SUB_PROCESS_NAME));
        // 设置子进程路径
        cef_string_from_wide(subProcessPath, MAX_PATH, &settings.browser_subprocess_path);
    
        auto myApp = CefRefPtr<MyApp>(new MyApp());
    
        CefInitialize(main_args, settings, myApp.get(), NULL);
        CefRunMessageLoop();
        CefShutdown();
    
        return 0;
    }

    在 BrowserSubProcess 工程下创建 main.cpp,编写如下代码。代码相当简单,仅仅是调用了 CefExecuteProcess()。

    #include "include/cef_app.h"
    #include <Windows.h>
    
    int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        CefMainArgs main_args(hInstance);
    
        return CefExecuteProcess(main_args, NULL, NULL);
    }

    编译两个工程后,确保两个 exe 在同一目录下,运行,结果如下。可以看到运行了不同的 exe 。
    这里写图片描述

    Chrome的多进程模型给DEBUG带来了很大的挑战。

    一、如果你设置代码的断点,默认情况下,VS只会跟踪那些在主进程Browser代码中的那些断点。VS提供了"Attach To Process"的方法。比如当Render Process启动之后,可以用菜单"Debug"=>"Attach To Process"选项,选择那个新产生的进程,然后在你需要跟踪的代码处设置断点,就可以。但是这种方法,只能在子进程启动之后,才比较有效,如果我们想在子进程启动时,跟踪某些代码的执行,就没有办法了。

    二、针对这个Chrome从源代码级别提供了支持。共有两种方法:

    1. 用启动选项“--single-process“,以单进程的方法来启动Chrome。

    2.用启动选项"--renderer-startup-dialog"和"--no-sandbox"。两个选项将会让子进程在启动之后,弹出一个模态对话框。之后在关闭这个对话框之后才可以继续运行代码。在这期间,我们可以用上述"Attach To Process"的方法来跟踪子进程代码的执行。

    之所以要加上"--no-sandbox",是因为默认情况下Chrome的子进程的创建和启动是在sanbox中(也就说访问系统资源是严格限制的),无法显示模态对话框UI

    Render进程的主函数如下:

    int RendererMain(const MainFunctionParams& parameters) {
      const CommandLine& parsed_command_line = parameters.command_line_;
      base::ScopedNSAutoreleasePool* pool = parameters.autorelease_pool_;
     
      // This function allows pausing execution using the --renderer-startup-dialog
      // flag allowing us to attach a debugger.
      // Do not move this function down since that would mean we can't easily debug
      // whatever occurs before it.
      HandleRendererErrorTestParameters(parsed_command_line);

    HandleRenderErrorTestParameters函数会显示这个模态对话框。

    // This function provides some ways to test crash and assertion handling
    // behavior of the renderer.
    static void HandleRendererErrorTestParameters(const CommandLine& command_line) {
      // This parameter causes an assertion.
      if (command_line.HasSwitch(switches::kRendererAssertTest)) {
        DCHECK(false);
      }
     
      // This parameter causes a null pointer crash (crash reporter trigger).
      if (command_line.HasSwitch(switches::kRendererCrashTest)) {
        int* bad_pointer = NULL;
        *bad_pointer = 0;
      }
     
      if (command_line.HasSwitch(switches::kRendererStartupDialog)) {
    #if defined(OS_WIN)
        std::wstring title = l10n_util::GetString(IDS_PRODUCT_NAME);
        title += L" renderer";  // makes attaching to process easier
        ::MessageBox(NULL, L"renderer starting...", title.c_str(),
                     MB_OK | MB_SETFOREGROUND);
    #elif defined(OS_LINUX)

     

    展开全文
  • 因为cef3是多进程模式,按F5调试时只会启动调试Browser进程,这时候有可能你下断点之后,通过日志发现虽然走过这段程序,但是不会在断点处停止。这是因为程序是在Browser进程中执行的,需要进入到Renderer进程才可以...

    因为cef3是多进程模式,按F5调试时只会启动调试Browser进程,这时候有可能你下断点之后,通过日志发现虽然走过这段程序,但是不会在断点处停止。这是因为程序是在Browser进程中执行的,需要进入到Renderer进程才可以进行调试。下面就是让程序在Renderer进程中运行的设置步骤:

    1. 打开client_app_browser.cpp(这是我工程的.cpp名称,不知道是否通用,可以直接找函数)找到command_line->AppendSwitch()函数,在下面紧接着增加command_line->AppendSwitch("--renderer-startup-dialog");
    2. 然后点击开始调试,会出现一个进程弹窗,如下,显示当前进程号为22992
    3. 将该进程附加到项目进程中
    4. 此时就可以执行断点调试了
    展开全文
  • 关于python多进程调试的思路

    千次阅读 2020-05-21 20:50:15
    最近使用多进程时,子进程中程序一直卡在某一步,然后就没有继续执行,原以为是多进程间互相干扰,最后发现是子进程报错了,而子进程不做任何处理,报错的时候,报错信息是不会打印的,因为一直找不到原因。...
  • 在2.5.60版Linux内核之后,GDB对使用fork、vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。follow-fork-mode的用法为set follow-fork-mode [parent|child] parent调试父进程,子进程不受影响 ...
  • 有的时候在Android Studio中明明设置了断点,也确认了代码会走到断点处,...这个时候就要用到远端进程调试了。在执行普通Debug调试之后,在进程启动的情况下,再如下图操作。就可以调试目标进程的代码了。 ...
  • Android 多进程调试技巧

    千次阅读 2019-07-16 13:54:07
    之前开发多进程的应用,想要调试Application 里面的代码,一直调试不了代码。 因为是多进程,Application 会执行两次。 原因: 比如我们有两个进程,一个叫进程a, 一个叫进程b. 因为我们android debug 的时候,选择...
  • vscode python 多进程,多线程,带参数调试vscode python 多进程,多线程,带参数调试多进程,多线程调试带参数调试 vscode python 多进程,多线程,带参数调试 多进程,多线程调试 高效的调试技巧可以快速找到程序...
  • gdb调试多进程

    千次阅读 2020-12-01 11:15:28
    在Linux系统下主要使用的调试器就是gdb, 但是在使用gdb的时候遇到了多进程的程序时,默认的配置我们是不可以直接多多个进程同时进行调试的, 需要设置几个参数… 例子 这里程序利用fork()函数生成了一个子进程(第一个...
  • VS2017 多进程之间调试

    千次阅读 2020-03-23 09:40:37
    当一个线程要调用另一个线程的接口函数时,在调试的时候需要调试子线程,下面...首先需要把子进程设置为调试进程,在工具栏里选择调试->其他调试目标->Child Process Debugging->enable Child Process...
  • windbg与多进程调试

    千次阅读 2011-08-14 08:54:38
    我们首先做个实验,来看windbg是否支持多进程调试, 我首先编写一个MFC工程命名为mutiprocess,在这个工程中简单添加一个按钮,作用是启动一个线程。代码如下:  // TODO: Add your control notification handler ...
  • GDB调试多进程/线程

    2021-07-17 23:16:49
    线程调试 选择调试进程 在GDB中有两个选项来确定调试进程: follow-fork-mode,设置调试哪个进程 detach-on-fork,GDB在fork之后是否断开(detach)某个进程调试 这两个选项的参数组合起来的效果如下表 ...
  • vs2010 多进程 调试

    千次阅读 2015-10-30 11:49:32
    有两个进程A、B,在进程A中启动进程B,并通过命令行向进程B传递参数,如何对进程B进行跟踪调试? 推荐方法: 1. 在B函数入口调用AfxMessageBox函数,当进程一旦进入这个函数就挂起,然后在VS2005里点击调试菜单...
  • 多进程、多线程调试

    2019-02-01 15:41:05
    一、线程调试 进程启动线程,是可以使用OD调试到线程中去的;...二、进程调试 2.1 OD调试时,是不会调到新进程中; 关键函数:CreateProcessW、CreateProcessA 例如:执行程序XXX.ovl的执行参数为:1378358...
  • gdb 多进程程序调试

    2010-09-27 00:17:08
    gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试 gdb 多进程程序调试
  • Vscode 附加进程调试

    千次阅读 2021-11-04 10:41:55
    文章目录一、vscode 远程连接二、vscode attach 调试1.vscode 调试 一、vscode 远程连接 (1)下载远程插件 (2)在远程端生成秘钥 #!bin/bash if [ $# -lt 1 ]; then echo “usage: $0 hostname@ip” exit fi ssh-...
  • gdb启动多进程程序并切换调试进程

    千次阅读 2019-05-23 20:47:15
    gdb是linux环境下调试C/C++程序的强大工具,但是最近在使用gdb启动一个多进程程序的时候总是意外退出,显示信息中包含Detaching after fork from child process 25377.这一句,而用attach命令附加到正在运行的进程却...
  • 最近用vs2010调试 android adb 代码, 该代码是由一个客户端来fork一个子进程(见adb.cpp中 launch_server函数,)创建server。 那么问题来了,当代码进入子进程后,怎么调试呢? 用过网上说的DebugBreak()函数,...
  • Linux gdb调试多进程

    千次阅读 2018-05-14 23:20:17
    gdbgdb是Linux下的调试工具,如果需要调试,则要在编译时加上-g选项,否则无法调试。gdb常用指令:gcc/g++ -g test.c/test.cpp ———-调试前先对源文件进行编译,注意一定要加 -g。 gdb a.out ——— a.out为可...
  • 使用 Visual Studio 调试多进程的程序

    千次阅读 2019-02-21 14:32:25
    当你的编写的是一个多进程的程序的时候,调试起来可能会比较困难,因为 Visual Studio 默认只会把你当前设置的启动项目的启动调试。 本文将介绍几种用 Visual Studio 调试多进程程序的方法,然后给出每种方法的适用...
  • 利用pycharm简单实现多进程

    千次阅读 2020-04-24 16:37:36
    python多进程需要使用进程池 from multiprocessing.pool import Pool import time def worker(x): print("worker"+"{number}".format(number=x)) time.sleep(1) return starttime = time.time() GROUP_START...
  • VS下Windows智能设备多进程联合调试方法
  • fork 多进程调试

    万次阅读 2015-06-11 17:04:31
    fork多进程调试一般有一下3种方法: 1. follow-fork-mode 用法: set follow-fork-mode [parent|child]   进入gdb后,直接设置,默认是parent 所以如果想要调试子进程,进入gdb后设置 ...
  • Linux gdb多进程、多线程调试

    千次阅读 2020-05-21 17:00:45
    gdb多进程调试 gdb多线程调试 前言 gdb 是linux平台下进行程序调试的最常用的工具。简单的程序调试就是加断点,然后一步一步让程序运行,直到找到 bug 。一般的程序调试起来比较简单,但是在多进程或多线程情况下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 300,239
精华内容 120,095
关键字:

多进程调试

友情链接: 3.rar