-
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:48CEF3 使用多进程。其中包括:一个浏览器进程、一个渲染进程和若干其他进程(处理插件的进程、处理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调试】多进程调试
2020-09-01 20:10:00因为cef3是多进程模式,按F5调试时只会启动调试Browser进程,这时候有可能你下断点之后,通过日志发现虽然走过这段程序,但是不会在断点处停止。这是因为程序是在Browser进程中执行的,需要进入到Renderer进程才可以...因为cef3是多进程模式,按F5调试时只会启动调试Browser进程,这时候有可能你下断点之后,通过日志发现虽然走过这段程序,但是不会在断点处停止。这是因为程序是在Browser进程中执行的,需要进入到Renderer进程才可以进行调试。下面就是让程序在Renderer进程中运行的设置步骤:
- 打开client_app_browser.cpp(这是我工程的.cpp名称,不知道是否通用,可以直接找函数)找到command_line->AppendSwitch()函数,在下面紧接着增加command_line->AppendSwitch("--renderer-startup-dialog");
- 然后点击开始调试,会出现一个进程弹窗,如下,显示当前进程号为22992
- 将该进程附加到项目进程中
- 此时就可以执行断点调试了
- 打开client_app_browser.cpp(这是我工程的.cpp名称,不知道是否通用,可以直接找函数)找到command_line->AppendSwitch()函数,在下面紧接着增加command_line->AppendSwitch("--renderer-startup-dialog");
-
关于python多进程调试的思路
2020-05-21 20:50:15最近使用多进程时,子进程中程序一直卡在某一步,然后就没有继续执行,原以为是多进程间互相干扰,最后发现是子进程报错了,而子进程不做任何处理,报错的时候,报错信息是不会打印的,因为一直找不到原因。... -
GDB多进程调试follow-fork-mode
2022-01-05 20:54:52在2.5.60版Linux内核之后,GDB对使用fork、vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。follow-fork-mode的用法为set follow-fork-mode [parent|child] parent调试父进程,子进程不受影响 ... -
Android Studio设置了断点却无法进入断点调试(多进程调试)
2021-06-22 11:49:17有的时候在Android Studio中明明设置了断点,也确认了代码会走到断点处,...这个时候就要用到远端进程调试了。在执行普通Debug调试之后,在进程启动的情况下,再如下图操作。就可以调试目标进程的代码了。 ... -
Android 多进程调试技巧
2019-07-16 13:54:07之前开发多进程的应用,想要调试Application 里面的代码,一直调试不了代码。 因为是多进程,Application 会执行两次。 原因: 比如我们有两个进程,一个叫进程a, 一个叫进程b. 因为我们android debug 的时候,选择... -
vscode python 多进程,多线程,带参数调试
2022-04-27 22:22:15vscode 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:08gdb 多进程程序调试 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:15gdb是linux环境下调试C/C++程序的强大工具,但是最近在使用gdb启动一个多进程程序的时候总是意外退出,显示信息中包含Detaching after fork from child process 25377.这一句,而用attach命令附加到正在运行的进程却... -
vs2010多进程调试 如何进入子进程
2015-01-28 10:30:34最近用vs2010调试 android adb 代码, 该代码是由一个客户端来fork一个子进程(见adb.cpp中 launch_server函数,)创建server。 那么问题来了,当代码进入子进程后,怎么调试呢? 用过网上说的DebugBreak()函数,... -
Linux gdb调试多进程
2018-05-14 23:20:17gdbgdb是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:36python多进程需要使用进程池 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智能设备多进程联合调试方法
2014-10-16 18:02:27VS下Windows智能设备多进程联合调试方法 -
fork 多进程调试
2015-06-11 17:04:31fork多进程调试一般有一下3种方法: 1. follow-fork-mode 用法: set follow-fork-mode [parent|child] 进入gdb后,直接设置,默认是parent 所以如果想要调试子进程,进入gdb后设置 ... -
Linux gdb多进程、多线程调试
2020-05-21 17:00:45gdb多进程调试 gdb多线程调试 前言 gdb 是linux平台下进行程序调试的最常用的工具。简单的程序调试就是加断点,然后一步一步让程序运行,直到找到 bug 。一般的程序调试起来比较简单,但是在多进程或多线程情况下...