2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как отследить куда ведет программа?
Сообщение23.02.2025, 12:56 
Вот фрагмент кода, о котором пойдет речь:

Код:
...
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. как (для эксперимента) явно заставить ее идти в функцию, прописанную в этом же файле (ведь для чего то же она была написана), не изменяя при этом имен функций и переменных?

 
 
 
 Re: Как отследить куда ведет программа?
Сообщение23.02.2025, 16:09 
granit201z в сообщении #1676098 писал(а):
как отловить куда уходит программа?

Отловил! Сначала выяснил через консоль, что делает это объявление переменной
Код:
        const request = JSON.stringify({
            '@type': 'setLogVerbosityLevel',
            new_verbosity_level: cfg.verbosityLevel
        });

Консоль показала результат:
Цитата:
{"@type":"setLogVerbosityLevel","new_verbosity_level":1}

Но когда это передается в функцию:
Код:
tdjsonAddon.tdnew.execute(request)

та падает без каких либо признаков жизни.
Но зачем то же они написали функцию:
Код:
const execute = function execute(request) {...

И в ней вычисляется свой request на базе одноименной переменной поданной в эту функцию. В общем я это вычисление вытащил наверх. Верхний request поменял на request1, т.к. он объявлен как const, и применил к нему это вычисление:
Получилось примерно так:
Код:
      console.log("init6");
      
        const request1 = JSON.stringify({
            '@type': 'setLogVerbosityLevel',
            new_verbosity_level: cfg.verbosityLevel
        });

      console.log("init7");
      console.log(request1);
//---------------------------------------------------------------------------------------------------------      
      const request = JSON.stringify((0, util_1.deepRenameKey)('_', '@type', request1));
      console.log(request);
//-----------------------------------------------------------------------------------------------------------------      
        const response = !cfg.useOldTdjsonInterface ? tdjsonAddon.tdnew.execute(request) : tdjsonAddon.tdold.execute(null, request);
      console.log("init8");
      console.log(response);
         
        debug('setLogVerbosityLevel response:', response);
    }

На это консоль выдала следующее:
Цитата:
init6
init7
{"@type":"setLogVerbosityLevel","new_verbosity_level":1}
"{\"@type\":\"setLogVerbosityLevel\",\"new_verbosity_level\":1}"
[ 3][t 0][1740314977.288417577][SynchronousRequests.cpp:66][&td_requests] Receive static request: testReturnError {
error = error {
code = 400
message = "Expected a JSON object"
}
}
[ 3][t 0][1740314977.289669752][SynchronousRequests.cpp:74][&td_requests] Sending result for static request: error {
code = 400
message = "Expected a JSON object"
}
init8
{"@type":"error","code":400,"message":"Expected a JSON object"}
init9

Т.е. более удачная версия request отличается от первоначальной наличием слешей. И программа уходит куда то в область C++. Он ругается, но все-таки создает на выходе переменную response:
Цитата:
{"@type":"error","code":400,"message":"Expected a JSON object"}

А программа начинает выполняться дальше и обваливается уже где то в глубине конструктора объекта Client.
Вся беда в том, что я так и не нашел файл SynchronousRequests.cpp поблизости от тех директорий, в которых у меня лежат js файлы.
Подскажите, пожалуйста:
1. может кто-то понимает в JSON объектах - На основе 2х неудачных попыток создания request может есть понимание, как должна выглядеть удачная переменная.
2. где можно найти исходный файл SynchronousRequests.cpp? точнее - какие есть, вообще, варианты. и есть ли они

 
 
 
 Re: Как отследить куда ведет программа?
Сообщение23.02.2025, 20:54 
granit201z в сообщении #1676145 писал(а):
2. где можно найти исходный файл SynchronousRequests.cpp? точнее - какие есть, вообще, варианты. и есть ли они

Нашел!
Кто молодец? Я молодец))
https://github.com/tdlib/td/blob/master/td/telegram/SynchronousRequests.cpp

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group