Mic*_*zyk 22 c++ multithreading thread-safety visual-studio visual-c++
我正在使我的应用程序线程安全.其中一个步骤是同步访问或消除全局变量的使用.我正在使用Visual Studio.我找不到任何在我的代码库中查找所有全局变量的好方法.创建一个好的文本搜索模式是不可能的,我找不到任何有用的工具.你们知道有什么好办法吗?它可以是源代码分析工具或二进制文件分析器.
一个选项可能是让链接器生成映射文件(Visual Studio中的/ MAP).
您将获得每个二进制文件的.map文件,其中包含两个部分:
细分表
Start Length Name Class
0001:00000000 00010000H .textbss DATA
0002:00000000 000034b4H .text CODE
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCAA DATA
0003:00000208 00000104H .CRT$XCZ DATA
0003:0000030c 00000104H .CRT$XIA DATA
...
Run Code Online (Sandbox Code Playgroud)
符号列表(函数和数据)
Address Publics by Value Rva+Base Lib:Object
0000:00000000 ___safe_se_handler_count 00000000 <absolute>
0000:00000000 ___safe_se_handler_table 00000000 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 __enc$textbss$begin 00401000 <linker-defined>
0001:00010000 __enc$textbss$end 00411000 <linker-defined>
0002:000003a0 _wmain 004113a0 f console4.obj
...
Run Code Online (Sandbox Code Playgroud)
您可以通过段列表中的"CODE"/"DATA"设计来区分变量中的函数.
优点:您将获得链接器未删除的所有符号,甚至是库中的符号.
Disadvanatge:您将获得链接器未删除的所有符号,甚至是库中的符号.我不知道任何自动执行代码/数据分离的工具.
我知道http://code.google.com/p/data-race-test/wiki/ThreadSanitizer程序(google 的产品)可以在 Windows 和编译代码上运行。它是动态检测程序(如 valgrind 或有点像 qemu/virtualbox),它为内存访问添加了一些检查。它将尝试发现一些线程问题。您可以在threadsanitizer的控制下运行您的程序。动态翻译和检测代码将会导致速度减慢(速度减慢 20 倍至 50 倍)。但有些问题会被自动检测到。
它还允许您在源代码中注释一些自定义同步函数。
程序的 Wiki 有其他线程竞争检测器的链接:http://code.google.com/p/data-race-test/wiki/RaceDetectionLinks