直接从VS里转到定义
今天阅读C++ Concurrency in Action 2nd Edition-2019,看到第四章:
std::this_thread::sleep_for(std::chrono::milliseconds(100));
突然好奇,这个sleep_for
和windows api的Sleep
有什么区别?
右键,转到定义:
发现sleep_for是调用的sleep_until。里面又有一个_Thrd_sleep。又追。
进入xthreads.h,阿勒,这里只有声明没有定义呢。
追进反汇编
这样,我转成Release(Debug里肯定会塞进一堆乱七八糟的运行时函数,调用的函数也很可能是debug版),再把程序跑起来,从反汇编里追call指令。
最后来到了只有地址的荒原。vs毕竟不像ollydbg,没有标出系统api地址。我也懒得用ollydbg,又要处理ASLR基址偏移的问题,麻烦。
如果是对.lib做反汇编呢
我又想了一下,可以找msvcrt的.lib,反编译.lib看它的调用地址。但想了想,反编译出来也不会像ollydbg一样注明api的,也是一串地址。
还是找STL源码算了
那么,哪里能找到STL的源码呢?参考了如何获取 C++ 标准库的源码其实很简单,MSVC的STL库就在github上:https://github.com/microsoft/STL
找到stl/src/cthread.cpp:
已经看到Sleep
函数了,再翻看前面#include <Windows.h>
,这就可以完全确定了。
顺便也看到了WaitForSingleObjectEx
这些函数,证明MSVC的STL在Windows下也是调用的Windows API。
这步骤看似很无聊,也早有人说过STL底层也是用了系统API,但我这人就是想要彻底确定这件事,拿出证据。