news 2026/3/10 6:26:15

C++小协程栈和临时变量及作用域的栈溢出问题分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++小协程栈和临时变量及作用域的栈溢出问题分析

问题分析

通过跟踪生成的汇编和 gdb 的info frame位置。发现替换之后,栈帧位置大幅增加了。比如对这类代码:

代码语言:javascript

AI代码解释

#define LOGFMT(...) \ do { \ auto buf = get_log_buffer_addr(); \ auto size = get_log_buffer_size(); \ auto fmt_res = fmt::format_to_n(buf, size, __VA_ARGS__); \ if (fmt_res.size >= size) { \ buf[size - 1] = 0; \ } else { \ buf[fmt_res.size] = 0; \ } \ std::cout << buf << '\n'; \ } while(false) void func1() { //... } void func2() { //... LOGFMT("test {}, data {}", a, b); func1(); }

LOGFMT(...)宏的实现里,使用fmt::format_to_nsnprintffunc1func2的函数栈顶增量大幅增加。

理论上,LOGFMT()的代码都处于子作用域里,无论是临时变量还是子作用域里的变量,出了作用域之后应该可以释放并被复用。 但是现在各个编译器(包括GCC、Clang和MSVC)似乎是为了方便调试信息定位和区分变量,都没有复用这部分栈空间。

而在我们项目工程里,有些地方使用了64K栈的协程。我改造的地方属于日志相关的模块,被大量多层级使用。 这两个因素叠加以后,恰好成为了压死骆驼的最后一根稻草。

问题测试代码

这里贴一下独立的复现和测试代码:

代码语言:javascript

AI代码解释

// -std=c++17 -O0 -g -ggdb -fno-omit-frame-pointer // /O0 /Zc:__cplusplus #include <fmt/format.h> #ifdef _MSC_VER # include <intrin.h> #endif #include <iostream> #include <cstddef> #include <string> #ifndef TEST_NOINLINE_NOCLONE # if defined(__clang__) # if __cplusplus >= 201103L # define TEST_NOINLINE_NOCLONE [[gnu::noinline]] # else # define TEST_NOINLINE_NOCLONE __attribute__((noinline)) # endif # elif defined(__GNUC__) && __GNUC__ > 3 # if __cplusplus >= 201103L && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 # define TEST_NOINLINE_NOCLONE [[gnu::noinline, gnu::noclone]] # else # define TEST_NOINLINE_NOCLONE __attribute__((noinline, noclone)) # endif # elif defined(_MSC_VER) # define TEST_NOINLINE_NOCLONE __declspec(noinline) # else # define TEST_NOINLINE_NOCLONE # endif #endif // 模拟日志代码 namespace { constexpr size_t get_log_buffer_size() { return 1 << 20; // 1 MiB } char* get_log_buffer_addr() { static char log_buffer[get_log_buffer_size()]; return log_buffer; } } #define LOGFMT(...) \ do { \ auto buf = get_log_buffer_addr(); \ auto size = get_log_buffer_size(); \ auto fmt_res = fmt::format_to_n(buf, size, __VA_ARGS__); \ if (fmt_res.size >= size) { \ buf[size - 1] = 0; \ } else { \ buf[fmt_res.size] = 0; \ } \ std::cout << buf << '\n'; \ } while(false) #ifdef _MSC_VER # define TEST_TOP_FRAME_ADDR ((uintptr_t)_AddressOfReturnAddress()) #else # define TEST_TOP_FRAME_ADDR ((uintptr_t)__builtin_frame_address(0)) #endif TEST_NOINLINE_NOCLONE void func_leaf(uintptr_t top, uintptr_t previous) { uintptr_t current = TEST_TOP_FRAME_ADDR; std::cout<< "======\n"<< "(LEAF) from func_no_var_no_fmt" << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; } TEST_NOINLINE_NOCLONE void func_no_var_no_fmt(uintptr_t top, uintptr_t previous) { uintptr_t current = TEST_TOP_FRAME_ADDR; std::cout<< "======\n"<< "from func_no_var_fmt_once" << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; func_leaf(top, current); } TEST_NOINLINE_NOCLONE void func_no_var_fmt_once(uintptr_t top, uintptr_t previous) { uintptr_t current = TEST_TOP_FRAME_ADDR; LOGFMT("======\n{}", "func_no_var_fmt_once"); std::cout<< "from func_no_var_fmt_twice" << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; func_no_var_no_fmt(top, current); } TEST_NOINLINE_NOCLONE void func_no_var_fmt_twice(uintptr_t top, uintptr_t previous) { uintptr_t current = TEST_TOP_FRAME_ADDR; LOGFMT("======\n{}", "func_no_var_fmt_twice"); LOGFMT("{}: previous offset: {}, top offset: {}", "from func_int_var_fmt_once", (previous - current), (top - current)); func_no_var_fmt_once(top, current); } TEST_NOINLINE_NOCLONE void func_int_var_fmt_once(uintptr_t top, uintptr_t previous, int p1) { uintptr_t current = TEST_TOP_FRAME_ADDR; volatile int p2 = 0; { char buf[1024]; LOGFMT("======\n{}: sizeof(parameter1): {}, sizeof(stack var): {}", "func_int_var_fmt_once", sizeof(p1), sizeof(p2)); } std::cout<< "from func_int_var_fmt_twice" << ", p2 addr: " << (uintptr_t)&p2 << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; func_no_var_fmt_twice(top, current); } TEST_NOINLINE_NOCLONE void func_int_var_fmt_twice(uintptr_t top, uintptr_t previous, int p1) { uintptr_t current = TEST_TOP_FRAME_ADDR; volatile int p2 = 0; LOGFMT("======\n{}: sizeof(parameter1): {}, sizeof(stack var): {}", "func_int_var_fmt_twice", sizeof(p1), sizeof(p2)); LOGFMT("{}: p2 addr: {}, previous offset: {}, top offset: {}", "from func_string_var_fmt_once", (uintptr_t)&p2, (previous - current), (top - current)); func_int_var_fmt_once(top, current, p1); } TEST_NOINLINE_NOCLONE void func_string_var_fmt_once(uintptr_t top, uintptr_t previous, std::string p1) { uintptr_t current = TEST_TOP_FRAME_ADDR; volatile std::string p2 = "from " + std::string(__FUNCTION__); LOGFMT("======\n{}: sizeof(parameter1): {}, sizeof(stack var): {}", "func_string_var_fmt_once", sizeof(p1), sizeof(p2)); std::cout<< p1 << ", p2 addr: " << (uintptr_t)&p2 << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; func_int_var_fmt_twice(top, current, 0); } TEST_NOINLINE_NOCLONE void func_string_var_fmt_twice(uintptr_t top, uintptr_t previous, std::string p1) { uintptr_t current = TEST_TOP_FRAME_ADDR; volatile std::string p2 = "from " + std::string(__FUNCTION__); LOGFMT("======\n{}: sizeof(parameter1): {}, sizeof(stack var): {}", "func_string_var_fmt_twice", sizeof(p1), sizeof(p2)); LOGFMT("{}: p2 addr: {}: , previous offset: {}, top offset: {}", p1, (uintptr_t)&p2, (previous - current), (top - current)); func_string_var_fmt_once(top, current, "from func_string_var_fmt_twice"); } TEST_NOINLINE_NOCLONE void func_empty(uintptr_t top, uintptr_t previous) { uintptr_t current = TEST_TOP_FRAME_ADDR; volatile int p2 = 0; std::cout<< "func_empty" << ", p2 addr: " << (uintptr_t)&p2 << ", previous offset: "<< (previous - current) << ", top offset: "<< (top - current) << '\n'; func_string_var_fmt_twice(top, current, "from func_empty"); } int main() { uintptr_t current = TEST_TOP_FRAME_ADDR; func_empty(current, current); return 0; }

各个编译器的编译指令在注释里,上测试运行。各个编译器的结论都差不多。 这里贴一下 Clang 20 的输出:

代码语言:javascript

AI代码解释

func_empty, p2 addr: 140734321135460, previous offset: 32, top offset: 32 ====== func_string_var_fmt_twice: sizeof(parameter1): 32, sizeof(stack var): 32 from func_empty: p2 addr: 140734321135184: , previous offset: 160, top offset: 192 ====== func_string_var_fmt_once: sizeof(parameter1): 32, sizeof(stack var): 32 from func_string_var_fmt_twice, p2 addr: 140734321134664, previous offset: 576, top offset: 768 ====== func_int_var_fmt_twice: sizeof(parameter1): 4, sizeof(stack var): 4 from func_string_var_fmt_once: p2 addr: 140734321134316, previous offset: 384, top offset: 1152 ====== func_int_var_fmt_once: sizeof(parameter1): 4, sizeof(stack var): 4 from func_int_var_fmt_twice, p2 addr: 140734321134052, previous offset: 288, top offset: 1440 ====== func_no_var_fmt_twice from func_int_var_fmt_once: previous offset: 176, top offset: 1616 ====== func_no_var_fmt_once from func_no_var_fmt_twice, previous offset: 240, top offset: 1856 ====== from func_no_var_fmt_once, previous offset: 128, top offset: 1984 ====== (LEAF) from func_no_var_no_fmt, previous offset: 48, top offset: 2032

可以看到,每次调用fmt接口增量都挺大。在-O2下可能是涉及内存对齐(我没有再仔细查看汇编),offset会更大。

解决方案

这个问题我试了一些方案,都无法零开销地解决这个问题。最后采用的方法是利用匿名的Lambda对象做一次中转。相当于把内存增量控制在Lambda表达式的对象本身的开销上。(直接加函数中转可能会被内联,从而导致栈仍然无法被复用)

按上面的代码例子就是LOGFMT(...)改成如下形式, 其他代码不变:

map.dzbneyo.cn/PoTs/088802.tmL
map.dzbneyo.cn/PoTs/559931.tmL
map.dzbneyo.cn/PoTs/357513.tmL
map.dzbneyo.cn/PoTs/599133.tmL
map.dzbneyo.cn/PoTs/773973.tmL
map.dzbneyo.cn/PoTs/959395.tmL
map.dzbneyo.cn/PoTs/733553.tmL
map.dzbneyo.cn/PoTs/137173.tmL
map.dzbneyo.cn/PoTs/595157.tmL
map.dzbneyo.cn/PoTs/151755.tmL
map.dzbneyo.cn/PoTs/373391.tmL
map.dzbneyo.cn/PoTs/593179.tmL
map.dzbneyo.cn/PoTs/931599.tmL
map.dzbneyo.cn/PoTs/939533.tmL
map.dzbneyo.cn/PoTs/115919.tmL
map.dzbneyo.cn/PoTs/175979.tmL
map.dzbneyo.cn/PoTs/973531.tmL
map.dzbneyo.cn/PoTs/393933.tmL
map.dzbneyo.cn/PoTs/717939.tmL
map.dzbneyo.cn/PoTs/737751.tmL
map.dzbneyo.cn/PoTs/799379.tmL
map.dzbneyo.cn/PoTs/199971.tmL
map.dzbneyo.cn/PoTs/791533.tmL
map.dzbneyo.cn/PoTs/533577.tmL
map.dzbneyo.cn/PoTs/193515.tmL
map.dzbneyo.cn/PoTs/193159.tmL
map.dzbneyo.cn/PoTs/517331.tmL
map.dzbneyo.cn/PoTs/973113.tmL
map.dzbneyo.cn/PoTs/393971.tmL
map.dzbneyo.cn/PoTs/929191.tmL
map.dzbneyo.cn/PoTs/551757.tmL
map.dzbneyo.cn/PoTs/351353.tmL
map.dzbneyo.cn/PoTs/591379.tmL
map.dzbneyo.cn/PoTs/397717.tmL
map.dzbneyo.cn/PoTs/799317.tmL
map.dzbneyo.cn/PoTs/915737.tmL
map.dzbneyo.cn/PoTs/359371.tmL
map.dzbneyo.cn/PoTs/551331.tmL
map.dzbneyo.cn/PoTs/991173.tmL
map.dzbneyo.cn/PoTs/591579.tmL
map.dzbneyo.cn/PoTs/719933.tmL
map.dzbneyo.cn/PoTs/355751.tmL
map.dzbneyo.cn/PoTs/775751.tmL
map.dzbneyo.cn/PoTs/155373.tmL
map.dzbneyo.cn/PoTs/779573.tmL
map.dzbneyo.cn/PoTs/951755.tmL
map.dzbneyo.cn/PoTs/735115.tmL
map.dzbneyo.cn/PoTs/591739.tmL
map.dzbneyo.cn/PoTs/177359.tmL
map.dzbneyo.cn/PoTs/753331.tmL
map.dzbneyo.cn/PoTs/937333.tmL
map.dzbneyo.cn/PoTs/519339.tmL
map.dzbneyo.cn/PoTs/935753.tmL
map.dzbneyo.cn/PoTs/919555.tmL
map.dzbneyo.cn/PoTs/997399.tmL
map.dzbneyo.cn/PoTs/937973.tmL
map.dzbneyo.cn/PoTs/111175.tmL
map.dzbneyo.cn/PoTs/791339.tmL
map.dzbneyo.cn/PoTs/793915.tmL
map.dzbneyo.cn/PoTs/351993.tmL
map.dzbneyo.cn/PoTs/717997.tmL
map.dzbneyo.cn/PoTs/997197.tmL
map.dzbneyo.cn/PoTs/715953.tmL
map.dzbneyo.cn/PoTs/975573.tmL
map.dzbneyo.cn/PoTs/997391.tmL
map.dzbneyo.cn/PoTs/531737.tmL
map.dzbneyo.cn/PoTs/799575.tmL
map.dzbneyo.cn/PoTs/939939.tmL
map.dzbneyo.cn/PoTs/951573.tmL
map.dzbneyo.cn/PoTs/137355.tmL
map.dzbneyo.cn/PoTs/177919.tmL
map.dzbneyo.cn/PoTs/397375.tmL
map.dzbneyo.cn/PoTs/117735.tmL
map.dzbneyo.cn/PoTs/913759.tmL
map.dzbneyo.cn/PoTs/977577.tmL
map.dzbneyo.cn/PoTs/739559.tmL
map.dzbneyo.cn/PoTs/951735.tmL
map.dzbneyo.cn/PoTs/357511.tmL
map.dzbneyo.cn/PoTs/993771.tmL
map.dzbneyo.cn/PoTs/599117.tmL
map.dzbneyo.cn/PoTs/957339.tmL
map.dzbneyo.cn/PoTs/931359.tmL
map.dzbneyo.cn/PoTs/737393.tmL
map.dzbneyo.cn/PoTs/197359.tmL
map.dzbneyo.cn/PoTs/939111.tmL
map.dzbneyo.cn/PoTs/313735.tmL
map.dzbneyo.cn/PoTs/139715.tmL
map.dzbneyo.cn/PoTs/959719.tmL
map.dzbneyo.cn/PoTs/711735.tmL
map.dzbneyo.cn/PoTs/737575.tmL
map.dzbneyo.cn/PoTs/715177.tmL
map.dzbneyo.cn/PoTs/775911.tmL
map.dzbneyo.cn/PoTs/793373.tmL
map.dzbneyo.cn/PoTs/979331.tmL
map.dzbneyo.cn/PoTs/933773.tmL
map.dzbneyo.cn/PoTs/137739.tmL
map.dzbneyo.cn/PoTs/377799.tmL
map.dzbneyo.cn/PoTs/719955.tmL
map.dzbneyo.cn/PoTs/355559.tmL
map.dzbneyo.cn/PoTs/131951.tmL
map.dzbneyo.cn/PoTs/377373.tmL
map.dzbneyo.cn/PoTs/777593.tmL
map.dzbneyo.cn/PoTs/911511.tmL
map.dzbneyo.cn/PoTs/139139.tmL
map.dzbneyo.cn/PoTs/951753.tmL
map.dzbneyo.cn/PoTs/991975.tmL
map.dzbneyo.cn/PoTs/753371.tmL
map.dzbneyo.cn/PoTs/317151.tmL
map.dzbneyo.cn/PoTs/951939.tmL
map.dzbneyo.cn/PoTs/751931.tmL
map.dzbneyo.cn/PoTs/533777.tmL
map.dzbneyo.cn/PoTs/951979.tmL
map.dzbneyo.cn/PoTs/177797.tmL
map.dzbneyo.cn/PoTs/799771.tmL
map.dzbneyo.cn/PoTs/395795.tmL
map.dzbneyo.cn/PoTs/119995.tmL
map.dzbneyo.cn/PoTs/555979.tmL
map.dzbneyo.cn/PoTs/997317.tmL
map.dzbneyo.cn/PoTs/535357.tmL
map.dzbneyo.cn/PoTs/799557.tmL
map.dzbneyo.cn/PoTs/731539.tmL
map.dzbneyo.cn/PoTs/155139.tmL
map.dzbneyo.cn/PoTs/515373.tmL
map.dzbneyo.cn/PoTs/311791.tmL
map.dzbneyo.cn/PoTs/533775.tmL
map.dzbneyo.cn/PoTs/993795.tmL
map.dzbneyo.cn/PoTs/715371.tmL
map.dzbneyo.cn/PoTs/535591.tmL
map.dzbneyo.cn/PoTs/973517.tmL
map.dzbneyo.cn/PoTs/799953.tmL
map.dzbneyo.cn/PoTs/135155.tmL
map.dzbneyo.cn/PoTs/919135.tmL
map.dzbneyo.cn/PoTs/399113.tmL
map.dzbneyo.cn/PoTs/559551.tmL
map.dzbneyo.cn/PoTs/311335.tmL
map.dzbneyo.cn/PoTs/999519.tmL
map.dzbneyo.cn/PoTs/331719.tmL
map.dzbneyo.cn/PoTs/995577.tmL
map.dzbneyo.cn/PoTs/379377.tmL
map.dzbneyo.cn/PoTs/591377.tmL
map.dzbneyo.cn/PoTs/919131.tmL
map.dzbneyo.cn/PoTs/555551.tmL
map.dzbneyo.cn/PoTs/519937.tmL
map.dzbneyo.cn/PoTs/791793.tmL
map.dzbneyo.cn/PoTs/715313.tmL
map.dzbneyo.cn/PoTs/335113.tmL
map.dzbneyo.cn/PoTs/915151.tmL
map.dzbneyo.cn/PoTs/177317.tmL
map.dzbneyo.cn/PoTs/719137.tmL
map.dzbneyo.cn/PoTs/931511.tmL
map.dzbneyo.cn/PoTs/115153.tmL
map.dzbneyo.cn/PoTs/593311.tmL
map.dzbneyo.cn/PoTs/951751.tmL
map.dzbneyo.cn/PoTs/735353.tmL
map.dzbneyo.cn/PoTs/979399.tmL
map.dzbneyo.cn/PoTs/337533.tmL
map.dzbneyo.cn/PoTs/337373.tmL
map.dzbneyo.cn/PoTs/175151.tmL
map.dzbneyo.cn/PoTs/775555.tmL
map.dzbneyo.cn/PoTs/957775.tmL
map.dzbneyo.cn/PoTs/355597.tmL
map.dzbneyo.cn/PoTs/317379.tmL
map.dzbneyo.cn/PoTs/131373.tmL
map.dzbneyo.cn/PoTs/151971.tmL
map.dzbneyo.cn/PoTs/393117.tmL
map.dzbneyo.cn/PoTs/577335.tmL
map.dzbneyo.cn/PoTs/177531.tmL
map.dzbneyo.cn/PoTs/779351.tmL
map.dzbneyo.cn/PoTs/335157.tmL
map.dzbneyo.cn/PoTs/757377.tmL
map.dzbneyo.cn/PoTs/199175.tmL
map.dzbneyo.cn/PoTs/357399.tmL
map.dzbneyo.cn/PoTs/517573.tmL
map.dzbneyo.cn/PoTs/791519.tmL
map.dzbneyo.cn/PoTs/739357.tmL
map.dzbneyo.cn/PoTs/137551.tmL
map.dzbneyo.cn/PoTs/775771.tmL
map.dzbneyo.cn/PoTs/591339.tmL
map.dzbneyo.cn/PoTs/557153.tmL
map.dzbneyo.cn/PoTs/357337.tmL
map.dzbneyo.cn/PoTs/771717.tmL
map.dzbneyo.cn/PoTs/137115.tmL
map.dzbneyo.cn/PoTs/539115.tmL
map.dzbneyo.cn/PoTs/713713.tmL
map.dzbneyo.cn/PoTs/539171.tmL
map.dzbneyo.cn/PoTs/551335.tmL
map.dzbneyo.cn/PoTs/197571.tmL
map.dzbneyo.cn/PoTs/933155.tmL
map.dzbneyo.cn/PoTs/531359.tmL
map.dzbneyo.cn/PoTs/999739.tmL
map.dzbneyo.cn/PoTs/153559.tmL
map.dzbneyo.cn/PoTs/973599.tmL
map.dzbneyo.cn/PoTs/193319.tmL
map.dzbneyo.cn/PoTs/519793.tmL
map.dzbneyo.cn/PoTs/151931.tmL
map.dzbneyo.cn/PoTs/575117.tmL
map.dzbneyo.cn/PoTs/539193.tmL
map.dzbneyo.cn/PoTs/579317.tmL
map.dzbneyo.cn/PoTs/779139.tmL
map.mdugfua.cn/PoTs/593977.tmL
map.mdugfua.cn/PoTs/999795.tmL
map.mdugfua.cn/PoTs/715599.tmL
map.mdugfua.cn/PoTs/139373.tmL
map.mdugfua.cn/PoTs/715371.tmL
map.mdugfua.cn/PoTs/931195.tmL
map.mdugfua.cn/PoTs/775151.tmL
map.mdugfua.cn/PoTs/731599.tmL
map.mdugfua.cn/PoTs/537577.tmL
map.mdugfua.cn/PoTs/971115.tmL
map.mdugfua.cn/PoTs/739131.tmL
map.mdugfua.cn/PoTs/555733.tmL
map.mdugfua.cn/PoTs/593577.tmL
map.mdugfua.cn/PoTs/153373.tmL
map.mdugfua.cn/PoTs/979195.tmL
map.mdugfua.cn/PoTs/797519.tmL
map.mdugfua.cn/PoTs/757351.tmL
map.mdugfua.cn/PoTs/735799.tmL
map.mdugfua.cn/PoTs/117751.tmL
map.mdugfua.cn/PoTs/117557.tmL
map.mdugfua.cn/PoTs/151771.tmL
map.mdugfua.cn/PoTs/317157.tmL
map.mdugfua.cn/PoTs/755533.tmL
map.mdugfua.cn/PoTs/335197.tmL
map.mdugfua.cn/PoTs/553933.tmL
map.mdugfua.cn/PoTs/159999.tmL
map.mdugfua.cn/PoTs/197559.tmL
map.mdugfua.cn/PoTs/357915.tmL
map.mdugfua.cn/PoTs/955157.tmL
map.mdugfua.cn/PoTs/771757.tmL
map.mdugfua.cn/PoTs/171531.tmL
map.mdugfua.cn/PoTs/573553.tmL
map.mdugfua.cn/PoTs/573975.tmL
map.mdugfua.cn/PoTs/399339.tmL
map.mdugfua.cn/PoTs/797577.tmL
map.mdugfua.cn/PoTs/753977.tmL
map.mdugfua.cn/PoTs/159737.tmL
map.mdugfua.cn/PoTs/379393.tmL
map.mdugfua.cn/PoTs/751535.tmL
map.mdugfua.cn/PoTs/199179.tmL
map.mdugfua.cn/PoTs/733153.tmL
map.mdugfua.cn/PoTs/151179.tmL
map.mdugfua.cn/PoTs/539997.tmL
map.mdugfua.cn/PoTs/551311.tmL
map.mdugfua.cn/PoTs/957513.tmL
map.mdugfua.cn/PoTs/359315.tmL
map.mdugfua.cn/PoTs/733375.tmL
map.mdugfua.cn/PoTs/975759.tmL
map.mdugfua.cn/PoTs/953335.tmL
map.mdugfua.cn/PoTs/535757.tmL
map.mdugfua.cn/PoTs/997379.tmL
map.mdugfua.cn/PoTs/317997.tmL
map.mdugfua.cn/PoTs/951115.tmL
map.mdugfua.cn/PoTs/337399.tmL
map.mdugfua.cn/PoTs/333555.tmL
map.mdugfua.cn/PoTs/955533.tmL
map.mdugfua.cn/PoTs/371371.tmL
map.mdugfua.cn/PoTs/191591.tmL
map.mdugfua.cn/PoTs/937393.tmL
map.mdugfua.cn/PoTs/715737.tmL
map.mdugfua.cn/PoTs/155915.tmL
map.mdugfua.cn/PoTs/351915.tmL
map.mdugfua.cn/PoTs/935599.tmL
map.mdugfua.cn/PoTs/931757.tmL
map.mdugfua.cn/PoTs/117733.tmL
map.mdugfua.cn/PoTs/993351.tmL
map.mdugfua.cn/PoTs/515331.tmL
map.mdugfua.cn/PoTs/175539.tmL
map.mdugfua.cn/PoTs/193131.tmL
map.mdugfua.cn/PoTs/995913.tmL
map.mdugfua.cn/PoTs/553935.tmL
map.mdugfua.cn/PoTs/515115.tmL
map.mdugfua.cn/PoTs/955511.tmL
map.mdugfua.cn/PoTs/711597.tmL
map.mdugfua.cn/PoTs/379173.tmL
map.mdugfua.cn/PoTs/951553.tmL
map.mdugfua.cn/PoTs/222228.tmL
map.mdugfua.cn/PoTs/919175.tmL
map.mdugfua.cn/PoTs/313513.tmL
map.mdugfua.cn/PoTs/082024.tmL
map.mdugfua.cn/PoTs/175355.tmL
map.mdugfua.cn/PoTs/866844.tmL
map.mdugfua.cn/PoTs/733795.tmL
map.mdugfua.cn/PoTs/775797.tmL
map.mdugfua.cn/PoTs/595553.tmL
map.mdugfua.cn/PoTs/793791.tmL
map.mdugfua.cn/PoTs/995919.tmL
map.mdugfua.cn/PoTs/777157.tmL
map.mdugfua.cn/PoTs/040480.tmL
map.mdugfua.cn/PoTs/624224.tmL
map.mdugfua.cn/PoTs/995991.tmL
map.mdugfua.cn/PoTs/571751.tmL
map.mdugfua.cn/PoTs/913753.tmL
map.mdugfua.cn/PoTs/191799.tmL
map.mdugfua.cn/PoTs/373979.tmL
map.mdugfua.cn/PoTs/171155.tmL
map.mdugfua.cn/PoTs/559371.tmL
map.mdugfua.cn/PoTs/399519.tmL
map.mdugfua.cn/PoTs/915395.tmL
map.mdugfua.cn/PoTs/995515.tmL
map.mdugfua.cn/PoTs/537919.tmL
map.mdugfua.cn/PoTs/951519.tmL
map.mdugfua.cn/PoTs/153579.tmL
map.mdugfua.cn/PoTs/991335.tmL
map.mdugfua.cn/PoTs/915759.tmL
map.mdugfua.cn/PoTs/113791.tmL
map.mdugfua.cn/PoTs/379577.tmL
map.mdugfua.cn/PoTs/733319.tmL
map.mdugfua.cn/PoTs/111919.tmL
map.mdugfua.cn/PoTs/244082.tmL
map.mdugfua.cn/PoTs/351997.tmL
map.mdugfua.cn/PoTs/733717.tmL
map.mdugfua.cn/PoTs/753311.tmL
map.mdugfua.cn/PoTs/755391.tmL
map.mdugfua.cn/PoTs/177753.tmL
map.mdugfua.cn/PoTs/757359.tmL
map.mdugfua.cn/PoTs/753711.tmL
map.mdugfua.cn/PoTs/179737.tmL
map.mdugfua.cn/PoTs/199779.tmL
map.mdugfua.cn/PoTs/711557.tmL
map.mdugfua.cn/PoTs/713737.tmL
map.mdugfua.cn/PoTs/551991.tmL
map.mdugfua.cn/PoTs/555519.tmL
map.mdugfua.cn/PoTs/555955.tmL
map.mdugfua.cn/PoTs/193115.tmL
map.mdugfua.cn/PoTs/739793.tmL
map.mdugfua.cn/PoTs/113739.tmL
map.mdugfua.cn/PoTs/717515.tmL
map.mdugfua.cn/PoTs/971157.tmL
map.mdugfua.cn/PoTs/177777.tmL
map.mdugfua.cn/PoTs/999515.tmL
map.mdugfua.cn/PoTs/733397.tmL
map.mdugfua.cn/PoTs/317915.tmL
map.mdugfua.cn/PoTs/199339.tmL
map.mdugfua.cn/PoTs/113177.tmL
map.mdugfua.cn/PoTs/537159.tmL
map.mdugfua.cn/PoTs/135771.tmL
map.mdugfua.cn/PoTs/008466.tmL
map.mdugfua.cn/PoTs/997359.tmL
map.mdugfua.cn/PoTs/571397.tmL
map.mdugfua.cn/PoTs/913533.tmL
map.mdugfua.cn/PoTs/713353.tmL
map.mdugfua.cn/PoTs/391393.tmL
map.mdugfua.cn/PoTs/595551.tmL
map.mdugfua.cn/PoTs/915933.tmL
map.mdugfua.cn/PoTs/339113.tmL
map.mdugfua.cn/PoTs/379799.tmL
map.mdugfua.cn/PoTs/971375.tmL
map.mdugfua.cn/PoTs/735579.tmL
map.mdugfua.cn/PoTs/353193.tmL
map.mdugfua.cn/PoTs/559111.tmL
map.mdugfua.cn/PoTs/191193.tmL
map.mdugfua.cn/PoTs/533735.tmL
map.mdugfua.cn/PoTs/353133.tmL
map.mdugfua.cn/PoTs/755191.tmL
map.mdugfua.cn/PoTs/771531.tmL
map.mdugfua.cn/PoTs/595557.tmL
map.mdugfua.cn/PoTs/173599.tmL
map.mdugfua.cn/PoTs/375791.tmL
map.mdugfua.cn/PoTs/951779.tmL
map.mdugfua.cn/PoTs/775159.tmL
map.mdugfua.cn/PoTs/759571.tmL
map.mdugfua.cn/PoTs/915319.tmL
map.mdugfua.cn/PoTs/197991.tmL
map.mdugfua.cn/PoTs/517371.tmL
map.mdugfua.cn/PoTs/355913.tmL
map.mdugfua.cn/PoTs/975175.tmL
map.mdugfua.cn/PoTs/319777.tmL
map.mdugfua.cn/PoTs/515717.tmL
map.mdugfua.cn/PoTs/711319.tmL
map.mdugfua.cn/PoTs/597199.tmL
map.mdugfua.cn/PoTs/175531.tmL
map.mdugfua.cn/PoTs/199751.tmL
map.mdugfua.cn/PoTs/335395.tmL
map.mdugfua.cn/PoTs/935579.tmL
map.mdugfua.cn/PoTs/339155.tmL
map.mdugfua.cn/PoTs/339711.tmL
map.mdugfua.cn/PoTs/779197.tmL
map.mdugfua.cn/PoTs/157515.tmL
map.mdugfua.cn/PoTs/375793.tmL
map.mdugfua.cn/PoTs/799119.tmL
map.mdugfua.cn/PoTs/751553.tmL
map.mdugfua.cn/PoTs/779195.tmL
map.mdugfua.cn/PoTs/933339.tmL
map.mdugfua.cn/PoTs/911975.tmL
map.mdugfua.cn/PoTs/577995.tmL
map.mdugfua.cn/PoTs/319791.tmL
map.mdugfua.cn/PoTs/591931.tmL
map.mdugfua.cn/PoTs/355935.tmL
map.mdugfua.cn/PoTs/915111.tmL
map.mdugfua.cn/PoTs/595773.tmL
map.mdugfua.cn/PoTs/573119.tmL
map.mdugfua.cn/PoTs/999771.tmL
map.mdugfua.cn/PoTs/751155.tmL
map.mdugfua.cn/PoTs/971395.tmL
map.mdugfua.cn/PoTs/535359.tmL
map.mdugfua.cn/PoTs/177533.tmL
map.mdugfua.cn/PoTs/935193.tmL
map.mdugfua.cn/PoTs/593997.tmL
map.fuemazt.cn/PoTs/951179.tmL
map.fuemazt.cn/PoTs/511571.tmL
map.fuemazt.cn/PoTs/793317.tmL
map.fuemazt.cn/PoTs/711711.tmL
map.fuemazt.cn/PoTs/919179.tmL
map.fuemazt.cn/PoTs/911951.tmL
map.fuemazt.cn/PoTs/111191.tmL
map.fuemazt.cn/PoTs/797159.tmL
map.fuemazt.cn/PoTs/753195.tmL
map.fuemazt.cn/PoTs/155931.tmL
map.fuemazt.cn/PoTs/393595.tmL
map.fuemazt.cn/PoTs/911955.tmL
map.fuemazt.cn/PoTs/999175.tmL
map.fuemazt.cn/PoTs/935957.tmL
map.fuemazt.cn/PoTs/739973.tmL
map.fuemazt.cn/PoTs/537919.tmL
map.fuemazt.cn/PoTs/515377.tmL
map.fuemazt.cn/PoTs/979173.tmL
map.fuemazt.cn/PoTs/739333.tmL
map.fuemazt.cn/PoTs/719337.tmL
map.fuemazt.cn/PoTs/393353.tmL
map.fuemazt.cn/PoTs/377115.tmL
map.fuemazt.cn/PoTs/111955.tmL
map.fuemazt.cn/PoTs/199191.tmL
map.fuemazt.cn/PoTs/539555.tmL
map.fuemazt.cn/PoTs/915735.tmL
map.fuemazt.cn/PoTs/793715.tmL
map.fuemazt.cn/PoTs/939913.tmL
map.fuemazt.cn/PoTs/771159.tmL
map.fuemazt.cn/PoTs/399939.tmL
map.fuemazt.cn/PoTs/915393.tmL
map.fuemazt.cn/PoTs/337155.tmL
map.fuemazt.cn/PoTs/919117.tmL
map.fuemazt.cn/PoTs/739971.tmL
map.fuemazt.cn/PoTs/133333.tmL
map.fuemazt.cn/PoTs/995919.tmL
map.fuemazt.cn/PoTs/157737.tmL
map.fuemazt.cn/PoTs/551359.tmL
map.fuemazt.cn/PoTs/575755.tmL
map.fuemazt.cn/PoTs/391799.tmL
map.fuemazt.cn/PoTs/959315.tmL
map.fuemazt.cn/PoTs/593533.tmL
map.fuemazt.cn/PoTs/173977.tmL
map.fuemazt.cn/PoTs/399779.tmL
map.fuemazt.cn/PoTs/573139.tmL
map.fuemazt.cn/PoTs/557759.tmL
map.fuemazt.cn/PoTs/797137.tmL
map.fuemazt.cn/PoTs/179717.tmL
map.fuemazt.cn/PoTs/957557.tmL
map.fuemazt.cn/PoTs/357593.tmL
map.fuemazt.cn/PoTs/935375.tmL
map.fuemazt.cn/PoTs/555919.tmL
map.fuemazt.cn/PoTs/995399.tmL
map.fuemazt.cn/PoTs/935171.tmL
map.fuemazt.cn/PoTs/159157.tmL
map.fuemazt.cn/PoTs/199719.tmL
map.fuemazt.cn/PoTs/733119.tmL
map.fuemazt.cn/PoTs/339935.tmL
map.fuemazt.cn/PoTs/935511.tmL
map.fuemazt.cn/PoTs/777993.tmL
map.fuemazt.cn/PoTs/773397.tmL
map.fuemazt.cn/PoTs/917337.tmL
map.fuemazt.cn/PoTs/913993.tmL
map.fuemazt.cn/PoTs/317933.tmL
map.fuemazt.cn/PoTs/333739.tmL
map.fuemazt.cn/PoTs/157539.tmL
map.fuemazt.cn/PoTs/535177.tmL
map.fuemazt.cn/PoTs/777399.tmL
map.fuemazt.cn/PoTs/317555.tmL
map.fuemazt.cn/PoTs/599795.tmL
map.fuemazt.cn/PoTs/155511.tmL
map.fuemazt.cn/PoTs/715153.tmL
map.fuemazt.cn/PoTs/751957.tmL
map.fuemazt.cn/PoTs/119797.tmL
map.fuemazt.cn/PoTs/999177.tmL
map.fuemazt.cn/PoTs/993779.tmL
map.fuemazt.cn/PoTs/335195.tmL
map.fuemazt.cn/PoTs/533919.tmL
map.fuemazt.cn/PoTs/131711.tmL
map.fuemazt.cn/PoTs/137773.tmL
map.fuemazt.cn/PoTs/179131.tmL
map.fuemazt.cn/PoTs/377993.tmL
map.fuemazt.cn/PoTs/159593.tmL
map.fuemazt.cn/PoTs/793977.tmL
map.fuemazt.cn/PoTs/717159.tmL
map.fuemazt.cn/PoTs/557957.tmL
map.fuemazt.cn/PoTs/599551.tmL
map.fuemazt.cn/PoTs/771539.tmL
map.fuemazt.cn/PoTs/753971.tmL
map.fuemazt.cn/PoTs/959791.tmL
map.fuemazt.cn/PoTs/393173.tmL
map.fuemazt.cn/PoTs/713397.tmL
map.fuemazt.cn/PoTs/755971.tmL
map.fuemazt.cn/PoTs/111111.tmL
map.fuemazt.cn/PoTs/713799.tmL
map.fuemazt.cn/PoTs/519973.tmL
map.fuemazt.cn/PoTs/395713.tmL
map.fuemazt.cn/PoTs/997377.tmL
map.fuemazt.cn/PoTs/179979.tmL
map.fuemazt.cn/PoTs/999157.tmL
map.fuemazt.cn/PoTs/731735.tmL
map.fuemazt.cn/PoTs/515931.tmL
map.fuemazt.cn/PoTs/717715.tmL
map.fuemazt.cn/PoTs/715377.tmL
map.fuemazt.cn/PoTs/759593.tmL
map.fuemazt.cn/PoTs/377197.tmL
map.fuemazt.cn/PoTs/731517.tmL
map.fuemazt.cn/PoTs/979371.tmL
map.fuemazt.cn/PoTs/513979.tmL
map.fuemazt.cn/PoTs/915559.tmL
map.fuemazt.cn/PoTs/597935.tmL
map.fuemazt.cn/PoTs/931735.tmL
map.fuemazt.cn/PoTs/755175.tmL
map.fuemazt.cn/PoTs/373951.tmL
map.fuemazt.cn/PoTs/933719.tmL
map.fuemazt.cn/PoTs/139997.tmL
map.fuemazt.cn/PoTs/199737.tmL
map.fuemazt.cn/PoTs/971715.tmL
map.fuemazt.cn/PoTs/111399.tmL
map.fuemazt.cn/PoTs/993317.tmL
map.fuemazt.cn/PoTs/355593.tmL
map.fuemazt.cn/PoTs/173331.tmL
map.fuemazt.cn/PoTs/739195.tmL
map.fuemazt.cn/PoTs/371131.tmL
map.fuemazt.cn/PoTs/957131.tmL
map.fuemazt.cn/PoTs/173977.tmL
map.fuemazt.cn/PoTs/555751.tmL
map.fuemazt.cn/PoTs/557955.tmL
map.fuemazt.cn/PoTs/115393.tmL
map.fuemazt.cn/PoTs/953595.tmL
map.fuemazt.cn/PoTs/579755.tmL
map.fuemazt.cn/PoTs/795359.tmL
map.fuemazt.cn/PoTs/793577.tmL
map.fuemazt.cn/PoTs/711557.tmL
map.fuemazt.cn/PoTs/597533.tmL
map.fuemazt.cn/PoTs/131915.tmL
map.fuemazt.cn/PoTs/773331.tmL
map.fuemazt.cn/PoTs/991915.tmL
map.fuemazt.cn/PoTs/117135.tmL
map.fuemazt.cn/PoTs/733373.tmL
map.fuemazt.cn/PoTs/951991.tmL
map.fuemazt.cn/PoTs/179759.tmL
map.fuemazt.cn/PoTs/373515.tmL
map.fuemazt.cn/PoTs/115993.tmL
map.fuemazt.cn/PoTs/917537.tmL
map.fuemazt.cn/PoTs/511755.tmL
map.fuemazt.cn/PoTs/579731.tmL
map.fuemazt.cn/PoTs/555951.tmL
map.fuemazt.cn/PoTs/395991.tmL
map.fuemazt.cn/PoTs/537539.tmL
map.fuemazt.cn/PoTs/531359.tmL
map.fuemazt.cn/PoTs/939997.tmL
map.fuemazt.cn/PoTs/199739.tmL
map.fuemazt.cn/PoTs/713559.tmL
map.fuemazt.cn/PoTs/511395.tmL
map.fuemazt.cn/PoTs/991931.tmL
map.fuemazt.cn/PoTs/333357.tmL
map.fuemazt.cn/PoTs/153173.tmL
map.fuemazt.cn/PoTs/551799.tmL
map.fuemazt.cn/PoTs/773579.tmL
map.fuemazt.cn/PoTs/131311.tmL
map.fuemazt.cn/PoTs/155373.tmL
map.fuemazt.cn/PoTs/193537.tmL
map.fuemazt.cn/PoTs/591711.tmL
map.fuemazt.cn/PoTs/319991.tmL
map.fuemazt.cn/PoTs/319757.tmL
map.fuemazt.cn/PoTs/557733.tmL
map.fuemazt.cn/PoTs/137175.tmL
map.fuemazt.cn/PoTs/751993.tmL
map.fuemazt.cn/PoTs/751571.tmL
map.fuemazt.cn/PoTs/313375.tmL
map.fuemazt.cn/PoTs/735171.tmL
map.fuemazt.cn/PoTs/797795.tmL
map.fuemazt.cn/PoTs/599933.tmL
map.fuemazt.cn/PoTs/535731.tmL
map.fuemazt.cn/PoTs/719113.tmL
map.fuemazt.cn/PoTs/511577.tmL
map.fuemazt.cn/PoTs/797115.tmL
map.fuemazt.cn/PoTs/557355.tmL
map.fuemazt.cn/PoTs/115155.tmL
map.fuemazt.cn/PoTs/571513.tmL
map.fuemazt.cn/PoTs/179379.tmL
map.fuemazt.cn/PoTs/597939.tmL
map.fuemazt.cn/PoTs/539913.tmL
map.fuemazt.cn/PoTs/975575.tmL
map.fuemazt.cn/PoTs/599173.tmL
map.fuemazt.cn/PoTs/957713.tmL
map.fuemazt.cn/PoTs/317335.tmL
map.fuemazt.cn/PoTs/135937.tmL
map.fuemazt.cn/PoTs/537191.tmL
map.fuemazt.cn/PoTs/315757.tmL
map.fuemazt.cn/PoTs/579117.tmL
map.fuemazt.cn/PoTs/717355.tmL
map.fuemazt.cn/PoTs/191595.tmL
map.fuemazt.cn/PoTs/751777.tmL
map.fuemazt.cn/PoTs/171319.tmL
map.fuemazt.cn/PoTs/553713.tmL
map.fuemazt.cn/PoTs/951779.tmL
map.fuemazt.cn/PoTs/311975.tmL

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 5:33:44

系统学习ESP-IDF环境变量设置:终结路径无效问题

彻底搞懂ESP-IDF环境配置&#xff1a;从“路径无效”到一键启动的实战指南 你有没有在终端敲下 idf.py build 后&#xff0c;突然弹出一行红字&#xff1a; the path for esp-idf is not valid 或者更让人抓狂的是——明明设置了路径&#xff0c;却提示&#xff1a; /too…

作者头像 李华
网站建设 2026/3/9 12:25:59

LVM使用

一、新增pv&#xff0c;vg&#xff0c;lv1、新增一块磁盘&#xff08;sdb&#xff09;[rootqian ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 …

作者头像 李华
网站建设 2026/3/7 5:43:40

ESP32与Blynk平台对接的智能插座实现:操作指南

用ESP32和Blynk打造一个真正能落地的智能插座&#xff1a;从零到上线完整实战你有没有过这样的经历&#xff1f;出门后突然想起客厅的电暖器好像没关&#xff0c;赶紧掏出手机翻了半天智能家居APP——结果发现根本没法远程控制。或者想让家里的鱼缸灯每天早上自动亮起&#xff…

作者头像 李华
网站建设 2026/3/8 15:54:39

PaddlePaddle预训练模型微调:迁移学习实战教学

PaddlePaddle预训练模型微调&#xff1a;迁移学习实战教学 在AI项目落地过程中&#xff0c;一个常见的现实是&#xff1a;我们手头的数据往往只有几千条&#xff0c;算力资源也仅限于单卡GPU&#xff0c;但业务方却期望模型能快速上线、准确率还要够高。从零训练一个深度网络&a…

作者头像 李华
网站建设 2026/3/5 6:11:09

PaddlePaddle Panoptic Segmentation:全景分割技术前沿

PaddlePaddle 与全景分割&#xff1a;构建统一视觉理解的国产化路径 在自动驾驶车辆驶过繁忙路口的瞬间&#xff0c;系统需要同时识别出“这是人行道”、“前方有三位行人”&#xff0c;并且明确区分他们各自的位置与运动轨迹。这种对场景既全面又精细的理解能力&#xff0c;正…

作者头像 李华