编程技巧 - 文章列表
-
C#跨线程访问控件报错Cross-thread operation not valid的解决方法(InvokeRequired、BeginInvoke、Dispatcher与InvokeAsync)
按Cross-thread operation not valid与The calling thread cannot access this object两种报错串讲:UI线程消息泵为何不让别的线程改控件、InvokeRequired加Invoke的标准写法与句柄未创建时的另一种报错、.NET 9才有的Control.InvokeAsync(8.0和Framework没有)、ConfigureAwait(false)的坑、Progress报告进度、Wait与Invoke互等死锁、WPF的CheckAccess与优先级、三种定时器差别。
-
Linux下git合并冲突与子模块报错的排查方法(CONFLICT冲突标记、reference is not a tree与detached HEAD定位)
按CONFLICT冲突标记、Your local changes会被覆盖、fatal: reference is not a tree、MERGE_HEAD exists四类报错串分开处理:git status里both modified与deleted by us的读法、diff3与zdiff3冲突视图怎么开(zdiff3需Git 2.35.0以上,Ubuntu 22.04源里的2.34.1不支持)、rebase下--ours与--theirs语义反转、冲突标记漏删的git grep拦截、子模块update与sync、detached HEAD成因、删除子模块的完整四步。
-
Go报错context deadline exceeded与dial tcp i/o timeout的排查方法(http.Client超时设置、Transport三个超时字段与数据库连接池定位)
Go里context deadline exceeded和dial tcp i/o timeout来源不同:前者是ctx或http.Client.Timeout到期,后者是建连阶段卡住。按报错串括号里的附加说明分诊,逐层配置Client.Timeout、context与Transport的DialContext、TLSHandshakeTimeout、ResponseHeaderTimeout,用curl分段耗时和httptrace定位到具体阶段,并说明resp.Body未关闭、MaxIdleConnsPerHost默认为2、database/sql连接池超时这三类常见根因。
-
PHP连接MySQL报错SQLSTATE[HY000] [2002] No such file or directory与Connection refused的排查方法(localhost与127.0.0.1区别、socket路径与3306端口定位)
PHP连接MySQL报SQLSTATE[HY000] [2002]时,No such file or directory表示走Unix域套接字没找到socket文件,Connection refused表示走TCP但端口没有进程在听。按报错串分诊:用php -i确认pdo_mysql.default_socket,用show variables查服务端真实socket路径,再区分skip-networking、bind-address、端口非3306、容器里127.0.0.1指向自身等六种情形,附2003、1045、2054报错的区分方法。
-
Windows文件删不掉报文件正在使用、需要管理员权限与源路径太长的解决方法(资源监视器、handle.exe定位占用进程与takeown长路径处理)
删文件弹出「文件已在另一程序中打开」「需要管理员权限」「源路径太长」,对应句柄占用、ACL与所有者、MAX_PATH三种不同原因。本篇给出资源监视器与handle.exe定位占用进程、takeown与icacls改权限、\?\前缀与LongPathsEnabled处理长路径、robocopy清空深层目录、chkdsk修复孤立记录的完整处置顺序。
-
Linux下Docker磁盘写满与overlay2目录暴涨的排查方法(docker system df定位、容器json日志限制与no space left on device解决)
Docker把磁盘写满时,容器退出、拉镜像报no space left on device。本篇按docker system df、df -i、du定位空间去向,讲清overlay2层结构与容器json-file日志撑爆盘的处理:truncate截断、daemon.json设max-size与max-file、prune从保守到激进的顺序,以及inode耗尽、句柄未释放和data-root迁移几种情况的处置办法。
-
Android应用ANR无响应的排查方法(Input dispatching timed out定位、/data/anr堆栈抓取与主线程卡顿修复)
App弹出无响应对话框时,logcat里Reason那一行的报错串决定了排查方向。记录四类ANR的超时阈值、用adb bugreport抓取/data/anr堆栈的方法、main线程状态与CPU usage段的读法,以及StrictMode与主线程消息耗时埋点的用法。
-
Java报错RejectedExecutionException与线程池任务堆积的排查方法(ThreadPoolExecutor参数、四种拒绝策略与Spring Boot默认线程池配置)
线上抛RejectedExecutionException时,报错串里的pool size、queued tasks已经把现场说清楚了。记录execute()的四级流转、四种拒绝策略的取舍、Spring Boot默认线程池无界队列带来的隐性问题,以及用jstack与打点定位堆积任务的做法。
-
Node.js报错JavaScript heap out of memory的排查方法(--max-old-space-size调整堆上限、堆快照抓取与内存泄漏定位)
先区分V8堆溢出与被系统OOM杀掉:前者该抬堆上限,后者要往下压。含node -e读heap_size_limit、NODE_OPTIONS与pm2的node_args写法、process.memoryUsage五个字段的读法、--heapsnapshot-signal抓三张快照做对比,以及全局缓存、事件监听重复注册这几个高频泄漏点。
-
Linux报错Too many open files的排查与解决方法(ulimit文件描述符上限、systemd LimitNOFILE与nginx worker_connections)
进程fd打到软限制1024时的完整排查路径:区分EMFILE与ENFILE、从/proc/PID/limits读真实上限、systemd服务加LimitNOFILE而不是改limits.conf、容器ulimit、nginx的worker_rlimit_nofile与worker_connections配套调整,以及用fd数量趋势判断是配置小还是代码在泄漏。