chainhelen

c语言内存分配

编译原理

c语言内存分配

背景 网上的关于c语言内存分配的文章满天飞,先随便荡一份事例,但是从不同的角度讲一下这个案例 对于下面的代码生成的程序,基本采用如下命令反编译 objdump -M intel -s -d -x main.o | objdump -s -x -d -M intel a.out | nl -ba -M intel 输出intel寄存格式,便于阅读 -s 输出section的信息 -d 反汇编.text的逻辑 -x 尽可能反编译信息 全局/静态初始化 首先看看全局初始化过的变量,它应该在反汇编哪个地方呢? 就是代码中变量 a 所对应的 100 #include <stdio.h> int a

By chainhelen

js

express.js 源码四探 —— application篇

本篇 本篇是这个系列的第四篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 application源码 app.init 戳这里,初始化app的一些参数 //导出的是这个app实例 var app = exports = module.exports = {}; //这个后面再讨论,关于代理 var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; //cache、engines、settings属性设置为空对象 app.init = function init() { this.cache = {}; this.engines = {}; this.settings = {}; //运行下面的默认配置函数 this.defaultConfiguration(); }; app.defaultConfiguration 一

By chainhelen

c语言

C语言不完全类型、延迟定义

问题 今天看到《自制编程语言》里面的提到这个不完全类型,我还真不知道 细节 大概是这样的,不让别人知道我们代码内部实现细节 比如我们实现一个栈,我们把数据结构的定义放在头文件里面,然后别人include我们头文件的时候(并添加.o),就能看到具体细节,比如可能就会主动操作里面的num或者array,破坏封装性 #ifndef STACK_H #define STACK_H typedef struct Stack{ int num; int array[MAX_N]; }Stack; #endif 实现 按照如下实现就不会有这样的问题 //stack.h #include <stdio.h> #include<stdlib.h> #include<string.

By chainhelen
express.js 源码三探 —— response篇

js

express.js 源码三探 —— response篇

本篇 本篇是这个系列的第三篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 response源码 Object.create 打开response.js,从上往下看代码,代码具体戳这里 var res = module.exports = { __proto__: http.ServerResponse.prototype }; 上一篇我们讲到request对象和http.IncomingMessage的关系,那么类似的response和ServerResponse也是一样的 但是注意最新的express代码中已经不用这个,采用Object.create(),看最新的代码 var res = Object.create(http.ServerResponse.prototype) Object.create是E5中提出的一种新的对象创建方式,本质上也是把res.__proto__指向ServerResponse.prototype res.status res.status = f

By chainhelen

js

express.js 源码二探 —— request篇

接上篇初探 上篇写的很乱,只是个人临时决定写的。主要试图从app.use和app.[method]之间区别着手,来解释express的中间件和路由的实现逻辑。 本篇 本篇很有可能依然保持上篇的发散性思维,所以各位读者可能要小心阅读,避免吐槽而亡。 环境 保持与上篇一致,源码版本是express.js 4.14.1 request源码 打开request.js,从上往下看代码 IncomingMessage var req = exports = module.exports = { __proto__: http.IncomingMessage.prototype }; 代码具体戳这里 我们要导出request这个对象,跟http.IncomingMessage有什么关系,而且是挂在request的__proto__原型链上 我们知道nodejs提供的原生http对象通常是这么用的 var http = require('http'); http.createServer( (function(

By chainhelen

ollydbg

ollydbg 试手 问题:i = i++

问题 很久以前准备写的一篇blog,当时只写了题目,调试用ollydbg搞的,最近才想起来要填坑 大概是问,如下c系语言 int i = 0; i = i++; 那么最终 i 的值是多少 调试环境 本来应该是ollydbg,但是现在电脑是64位,还是用ida pro 1.6 64位 codeblocks 16.01 gcc version 4.9.2 windows10 main.cpp #include <stdio.h> int main() { int i = 0; i = i++; //为什么要加hello world,纯粹只是为了让调试的时候方便点 printf(

By chainhelen

js

ajax-hook.js 剖析

问题 今天某群里有人提了这样一个问题 就是在chrome调试器明明打印出来了xhr,能看到response的值,而在代码里面直接打印response却看不见这个值 结论 直接上结论,console.log打印的是xhr的引用,也就是说,open在打印的时候,xhr其实是对的,xhr.response也确实是空字符串的。但是后来请求完毕过后,xhr.response这个值被修改了,接着才是点开chrome dev-tool里面的XMLHttpRequest,所以这时候才能看到response,产生了一种错觉。 ajax-hook.js 发现这个库代码写得十分简洁 这里是demo代码 hookAjax({ onreadystatechange:function(xhr){ console.log("onreadystatechange called: %O",xhr) //return true }, onload:function(xhr){

By chainhelen

tcp

大量假established

问题 上次tomcat并发一直有个问题没有解决,就是直播中途有一段时间,广东这边部分地区不能访问. 而从日志上来看,那个时间段是有用户授权访问的. 而且负载均衡各项硬件资源都是正常的(CPU、内存、网络连接均占用不到20%,未达到瓶颈). 虽然有怀疑是dns解析问题,但是复现不出来了. 活动过后测试 测试复现中出现大量错误 READ ECONNRESET、CONNECT ETIMEOUT 下载了原生的tomcat,只访问index.html,也出现同样的问题 准备过程 服务器A 运行脚本,发送http请求到服务器B上的8081端口 ip地址为112.74.128.91 服务器B 上跑着tomcat,监听8081端口 ip地址为120.24.180.89 两个ip地址都是公网地址 服务器A 第一 为了只对出问题的报文进行研究,我在发送http报文的url上添加一些参数. //main.js "use strict" let

By chainhelen