2014 dxdy logo

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

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




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


12/03/17
709
Вот фрагмент кода, о котором пойдет речь:

Код:
...
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 


12/03/17
709
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 


12/03/17
709
granit201z в сообщении #1676145 писал(а):
2. где можно найти исходный файл SynchronousRequests.cpp? точнее - какие есть, вообще, варианты. и есть ли они

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group