注册

CpuDbg x96

查看: 1215|回复: 0
收起左侧

[CpuDbg x96] 字符串搜索插件debug版本正常,release版本崩溃

[复制链接]
发表于 2022-6-3 16:44:56 | 显示全部楼层 |阅读模式
字符串搜索插件debug版本正常,release版本崩溃
这个问题挺吊詭的, 之前还真没注意过这些.

调试器编译debug一切都正常,编译成release就异常崩溃了.
调试分析发现出错的地方就是插件给调试器传参数时, 其中一个结构体数据没有获取到.
结构体大概是这样的:

[C] 纯文本查看 复制代码
typedef struct
{
     string xxx1;
     dword xx2;
}



就是这个结构体引发的"血案".
一开始也只是大概定位到是传参出错的, 但通过 watch 窗口还真不容易发现崩溃原因.
因为我传的参数是一个挺复杂的结构体. m$ ide的watch窗口也不支持查看复杂变量的偏移和地址.

我在字符串搜索插件那边调试发现参数确实是有传过来的. 但是接收到的就是少了那个结构体.
我猜测就可能和结构体大小有关系. 有可能是两边的结构体对齐方案不致导致的.
可是我看了两个工程的代码 #pragma pack 相关可疑的,都剃除了. IDE设置里面     配置属性    ->    C/C++  ->   代码生成    ->    结构成员对齐   也都是默认值.
很诡异吧! 并没发现可疑的. 于是我在两边工程都加了日志输出, 发现, 我将传的参数 sizeof 一下, 两边的大小确实不一样.
输出日志如下:

[C] 纯文本查看 复制代码
[28592] 2022-06-03 20:06:59     plugin  大小: 584 
[28592] 2022-06-03 20:06:59:0986  asmdbg 大小 592 

[18272] 2022-06-03 20:11:12     plugin  大小: 578 
[18272] 2022-06-03 20:11:12:0841  asmdbg 大小 592 

[18004] 2022-06-03 20:14:45     plugin  大小: 584 
[18004] 2022-06-03 20:14:45:0329  asmdbg 大小 592 


(输出了三次, 三次里面,我改了字符串搜索插件工程对齐大小.每次改的是几字节对齐,已经记不清了.反正没有一次是可以和 调试器的大小对的上的)
其中带 plugin 信息的是 字符串搜索插件输出的参数大小
带 asmdbg 信息的是 调试器输出的参数大小

同一个参数, 同样的 对齐设置, 输出的大小确不一样.真的很奇怪.
于是我把成员里面的 string 大小输出看一看  sizeof string.
发现 问题就是出在 string string. 插件输出的大小是 40.
调试器输出的大小是48.

从网上搜了一下, 下文是网上搜索的说法:

[C] 纯文本查看 复制代码
string的实现在各库中可能有所不同,
但是在同一库中相同一点是,无论你的string里放多长的字符串,
它的sizeof ()都是固定的,
字符串所占的空间是从堆中动态分配的,与sizeof ()无关


网上说的, 有的人 输出的大小是 4  有 12  有 32的  而我两边输出的是 40 和 48.

经过我一系列的测试, 最终发现影响这个大小的是  配置属性    ->    C/C++  ->   代码生成    ->    运行库   这个选项.
我测试不管是 /MD 还是 /MT 输出的都是 40.  而 /MDd  /MTd 输出的都是 48.

知道问题后, 只要将两边改成一样,就解决问题了.
最终 字符串搜索效果图:

字符串搜索插件

字符串搜索插件







回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-5-18 16:47 , Processed in 0.062500 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表