debug : 调试主进程启动的子进程
发布日期:2021-06-30 22:01:37
浏览次数:2
分类:技术文章
本文共 2682 字,大约阅读时间需要 8 分钟。
情况分两种
不带参数启动子进程
MS提供了调试方法
/// 不带参数启动的子进程自动附加调试方法, MS已经提供 /// http://msdn.microsoft.com/en-us/library/a329t4ed(v=vs.90).aspx /// <>
当主进程CreateProcess 符合名字的EXE子进程时, 子进程就会被我们的调试器接住.
带参数启动子进程
这种情况, MS提供的方法不适用. 调试器不识别传来的参数, 调试器会弹出报错提示, 说 "参数.exe" 找不到
我想到的解决方法如下:
* 用OD实例1 启动主进程, 单步到CreateProcess执行前, 记录下子进程名称和命令行参数
* 用OD实例2 按照主进程建立子进程的名称和命令行参数,启动子进程.
* 在OD实例1中, 跳过主进程中CreateProcess的代码, 注意堆栈平衡, 使主进程能继续跑下去.
这样就可以用2个OD实例,连续调试主进程和子进程. 即使主进程和子进程有交互, 也不影响.
主进程自己启动子进程,穿进的参数仅为 "命令行参数"
用OD打开进程的命令行参数 为 "子程序全路径 + 命令行参数"
为了完全模拟主进程CreateProcess的结果, 需要在OD实例2中, 将命令行参数指针,手工改改,指到具体的命令行参数上.
被调试的程序一般都不是我们写的, 为了模拟出和主进程一样的参数给子进程用, 需要找到子进程用命令行参数的地方,手工将参数指针改掉.
例如:
主程序测试代码
#include#include #include /// 主程序是多字节版本#define CREATE_PROCESS_BY_CMD_LINE#define SUB_PROC_NAME "showcmd.exe"#define CMD_LINE_PARAM "abc 111 222 333 444 555"void main(){ BOOL bRc = TRUE; PROCESS_INFORMATION psInfo; STARTUPINFO sInfo; LPVOID lpMsgBuf = NULL; memset((char *)&sInfo, 0, sizeof(STARTUPINFO)); sInfo.cb = sizeof(STARTUPINFO); sInfo.dwFlags = STARTF_USESTDHANDLES; sInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); /* BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation ); */#ifdef CREATE_PROCESS_BY_CMD_LINE /// CreateProcess 启动带参数的子进程 bRc = CreateProcess(SUB_PROC_NAME, CMD_LINE_PARAM, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &psInfo);#else /// CreateProcess 启动不带参数的子进程 /// 不带参数启动的子进程自动附加调试方法, MS已经提供 /// http://msdn.microsoft.com/en-us/library/a329t4ed(v=vs.90).aspx /// < > bRc = CreateProcess(SUB_PROC_NAME, "", NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &psInfo);#endif ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); if (NULL != lpMsgBuf) { printf("%s",lpMsgBuf); LocalFree(lpMsgBuf); lpMsgBuf = NULL; } _tprintf(_T("END, press any key to quit\r\n")); getwchar();}
转载地址:https://lostspeed.blog.csdn.net/article/details/10109867 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月23日 18时22分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
软件质量的8个特性
2019-04-30
应届渣渣前端的艰难求职之路
2019-04-30
2021年不可错过的17种JS优化技巧(一)
2019-04-30
月薪15~20k的前端面试问什么?
2019-04-30
在 Vue 中用 Axios 异步请求API
2019-04-30
MYSQL——事务操作+视图+存储引擎
2019-04-30
MySQL进阶查询(SELECT 语句高级用法)
2019-04-30
Mysql 之主从复制
2019-04-30
【学习笔记】对vanilla的一些个人理解
2019-04-30
【NLP学习笔记】知识图谱阅读笔记及其心得
2019-04-30
【工具使用】新版CSDN-markdown编辑器使用指南
2019-04-30
【NLP学习笔记】中文分词(Word Segmentation,WS)
2019-04-30
【超越白皮书7】你需要知道关于ETH2.0的几个事实
2019-04-30
对于时间复杂度的通俗理解
2019-04-30
如何输入多组数据并输出每组数据的和?
2019-04-30
行阶梯型矩阵
2019-04-30
C++学习笔记
2019-04-30
图像处理学习笔记
2019-04-30
Machine Learning Onramp on MATLAB 学习笔记
2019-04-30
Learning DSP with MATLAB
2019-04-30