字符串搜索插件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.
知道问题后, 只要将两边改成一样,就解决问题了.
最终 字符串搜索效果图:
字符串搜索插件
|