Posts

如何快速调试并找到在std::thread子线程中抛出的C++异常问题!

Image
C++11标准库新增的std::thread类可以方便地开启子线程。然而有个奇怪的现象是,如果在这些子线程中抛出了未处理的C++异常而导致程序崩溃,那么在生成的dump文件中将还原不出异常发生时的调用栈。可以通过下面的方法来展示这个现象。 首先使用以下代码生成一个控制台程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # include <thread> # include <vector> std::thread* g_thread; void ThreadEntry () { std::vector< int > v; v. at ( 0 ); } int main () { g_thread = new std:: thread (ThreadEntry); g_thread-> join (); } 这段代码很简单,就是通过std::thread创建一个子线程,并且在这个子线程中访问一个空的std::vector中的元素,让它抛出C++异常。务必要使用Release配置来生成程序,不能使用Debug配置。 接下来,在资源管理器中直接运行该程序,注意不要通过调试器来运行。一般会在第二次运行的时候,出现下面的Windows错误报告窗口: 在详细信息中的C:\Users\Zplutor\AppData\Local\Temp\WERBF98.tmp.mdmp文件即是Windows错误报告为崩溃的程序生成的dump文件,里面包含了程序崩溃时的一些信息,例如函数调用栈。该文件在关闭了错误报告窗口时即被删除,所以要先把这个文件复制出来。 最后,用WinDbg打开这个dump文件,先用.ecxr命令切换到异常环境,再用k命令显示调用栈,结果显示如下: 1 2 3 4 5 6 7 8 9 10 11 0:002> k *** Stack trace for last set context - .thread/.cxr resets it ChildEBP RetAddr 0095f07c 6ba8dc5f msvcr120!abort+0x38 [f:\dd\vctools\crt\crtw32\misc\abort.c @ 90] 009

net.ipv4.ip_local_port_range 的值究竟影响了啥,和UDP connect之间的关系是什么?

前言 网上关于  net.ipv4.ip_local_port_range  的值的效果众说纷纭(下面所说的连接都假定使用的是相同的协议(都是 TCP 或 UDP)): 大部分文章都说这个值决定了客户端的一个 ip 可用的端口数量,即一个 ip 最多只能创建 60K 多一点的连接(1025-65535),如果要突破这个限制需要客户端机器绑定多个 ip。 还有部分文章说的是这个值决定的是 socket 四元组中的本地端口数量,即一个 ip 对同一个目标 ip+port 最多可以创建 60K 多一点连接,只要目标 ip 或端口不一样就可以使用相同的本地端口,不一定需要多个客户端 ip 就可以突破端口数量限制。 文档  中的介绍也很模糊: ip_local_port_range - 2 INTEGERS Defines the local port range that is used by TCP and UDP to choose the local port. The first number is the first, the second the last local port number. If possible, it is better these numbers have different parity. (one even and one odd values) The default values are 32768 and 60999 respectively. 下面就通过TCP来做一些实验来确认这个选项的实际效果。 实验环境: $ uname -a Linux vagrant 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 相同目标 ip 和相同目标端口下的端口数量限制 先设置 ip_local_port_range 的值为非常小的范围: $ echo "61000 61001" | sudo tee /proc/sys/net/ipv4/ip_local_port_range 61000 61001 $ cat /proc/sys/ne

美国 公共 共享 apple id 苹果ID 分享,记住只能下载哦!

因政策或其它原因,有些app在本地的苹果app store搜索不到。如果有其它国家或地区的apple id,那么可以切换app store的登录账号下载或者购买所需要的软件。 本页面提供的境外apple id搜集自互联网且注明来源,其中部分账号已购买Shadowrocket(小火箭)等付费软件,登录后可直接下载。请注意 使用时不要登录icloud,使用完后请自觉退出 。 如果apple id密码错误或账号被锁,请尝试其它账号或者访问原网页信息获取最新的账号密码。如果你想自己申请境外账号,请参考: 超简单的,美区苹果ID(APPLE ID)注册方法! 美区id: appidstorecom@outlook.com ,密码: App86686 来源网页: https://mac.ms/1108.html 美区账号: ff4304f9@icloud.com ,密码: Share1100 美区账号: kobelbj1412@gmail.com ,密码: IOSfuli99 账号: stonerock8866@gmail.com ,密码: Yk520520 账号: zhiwu1966@163.com ,密码: Thessr.cn1 备注:信息来源网页: https://t.me/s/shadowrocketid id: ye92581814@163.com ,密码: Aa110011 备注:来源网页: http://dnmr.net/ssios/ 美国 apple id: i7ehkk@163.com , 密码: Ax112211(用完麻烦退出) 美国 apple id: kv8ovy@163.com (必须在蓝色 AppStore软件里面登录使用,已购小火箭) ,密码: Ax112211(如果去设置里面登录使用,你的手机会变砖!) 备注:以上信息来源网页: https://github.com/shadowrocketHelp/help/wiki/%E5%9B%BD%E5%A4%96-appstore-id-%E8%B4%A6%E5%8F%B7%E5%88%86%E4%BA%AB | 账号1: |  4ssgit@Gmail.com  | 密码: | 4ssGit1234 | 已下载Shadowrocket小火箭 | 账号2: |  1714477@Gmail.com  |

Linux 服务器 存在多网卡多IP UDP 监听 INADDR ANY(0.0.0.0)出现收包源IP不一致问题解决方案!

Image
在多IP服务器上,通过策略路由如何保证 回复给客户端的数据不从 从原来的网卡出去导致访问不通的问题? 比如在一台双线上,电信 IP 是182.x.x.119 ,网通 IP 是 119.x.x.107  可以通过以下策略路由保证: ip route flush table ct ip route add default via 182.x.x.97 dev eth0 src 182.x.x.119 table ct ip rule add from 182.x.x.119 table ct ip route flush table cu ip route add default via 119.x.x.97 dev eth1 src 119.x.x.107 table cu ip rule add from 119.x.x.107 table cu 对这段策略路由简单解释下。 ip rule add from 182.x.x.119 table ct  表示源地址是 182.x.x.119 的包,通过ct路由表选路, ip route add default via 182.x.x.97 dev eth0 src 182.x.x.119 table ct  表示ct路由表的默认路由是从 eth0 的 182.x.x.97 这个网关路由,源地址设置为 182.x.x.119 。 有了这层保证后,我们在实现Server 的时候,监听 socket 依然 bind 到 0.0.0.0 ,在回 数据 包的时候,只要设置该数据包从本机发出去的 源地址 配合策略路由,就可以保证 数据包 正确返回。 现在的关键问题是:  如何获取 数据 包的目的地址?   对于无连接状态的 UDP socket 获取目的地址就很难了,木有现成的系统调用,获取方法还是有点点麻烦的。通过  man ip  可以获取详细的步骤和原理: IP_PKTINFO (since Linux 2.2) Pass an IP_PKTINFO ancillary message that contains a pktinfo structure that supplies some information about the incoming packet. This only works