Вот фрагмент кода, о котором пойдет речь:
Код:
...
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
console.log(__setModuleDefault);
console.log('fSMD '+__setModuleDefault);
...
function init() {
if (tdjsonAddon != null)
return;
debug('Initializing the node addon');
const lib = path.join(cfg.libdir, cfg.tdjson);
tdjsonAddon = (0, addon_1.loadAddon)(lib, cfg.useOldTdjsonInterface);
if (cfg.verbosityLevel !== 'default') {
debug('Executing setLogVerbosityLevel', cfg.verbosityLevel);
const request = JSON.stringify({
'@type': 'setLogVerbosityLevel',
new_verbosity_level: cfg.verbosityLevel
});
console.log('f '+tdjsonAddon.tdnew.execute);
const response = !cfg.useOldTdjsonInterface ? tdjsonAddon.tdnew.execute(request) : tdjsonAddon.tdold.execute(null, request);
debug('setLogVerbosityLevel response:', response);
}
}
const execute = function execute(request) {
console.log("exec");
if (tdjsonAddon == null) {
init();
if (tdjsonAddon == null)
throw Error('TDLib is uninitialized');
}
debug('execute', request);
request = JSON.stringify((0, util_1.deepRenameKey)('_', '@type', request));
const response = !cfg.useOldTdjsonInterface ? tdjsonAddon.tdnew.execute(request) : tdjsonAddon.tdold.execute(null, request);
return (0, util_1.deepRenameKey)('@type', '_', JSON.parse(response));
};
exports.execute = execute;
...
Заметил у консоли одно интересное свойство (речь про код на js). Когда мы ставим "ловушку" типа:
Код:
console.log(__setModuleDefault);
после, например, такого кода:
Код:
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
В консоль будет выведено:
Цитата:
[Function (anonymous)]
Но если ловушку несколько переделать:
Код:
console.log('fSMD '+__setModuleDefault);
То консоль покажет код полученной (в результате издевательства над определением переменной) функции:
Цитата:
fSMD function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}
И я решил попробовать таким методом перепроверить код той функции, на которой валится моя программа. В том месте, где все уже было готово для отправки в функцию я прописал:
Код:
console.log('f '+tdjsonAddon.tdnew.execute);
ожидал увидеть что-то такое:
Цитата:
f function execute(request) {
console.log("exec");
if (td..
.
Но консоль выдала следующее:
Цитата:
f function execute() { [native code] }
Полез в интернет и нашел там описание ситуации:
Когда вы определяете функции на интерпретируемом языке (в отличие от компилируемого языка). У вас есть доступ к файлу / строке / тексту, который определяет функцию.
В JavaScript, например, вы можете прочитать текст определения тела функции, которую вы определили:
Если вы попытаетесь сделать то же самое для функции, которая включена конструкцией* в JavaScript, она будет реализована не как текст, а как двоичный код.
Нет причин показывать двоичный код, который реализует эту функцию, потому что он нечитаем и может быть даже недоступен.
И у меня возникло подозрение, что программа не идет в функцию-тезку, прописанную в том же файле (оттого и не достигается метка "exec", которую никак не обойти при входе в функцию), а уходит куда-то в другое место. Где благополучно и валится.
В связи с этим вопроса на самом деле два:
1. как отловить куда уходит программа? Машинный код, конечно, не интересен, но возможно можно понять из какого исходника он был создан и попытаться прочесть этот исходник
2. как (для эксперимента) явно заставить ее идти в функцию, прописанную в этом же файле (ведь для чего то же она была написана), не изменяя при этом имен функций и переменных?