С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
1

Как узнать глубину стека вызовов?

23.03.2018, 09:56. Просмотров 850. Ответов 7
Метки нет (Все метки)

Добрый день!
Подскажите пожалуйста как узнать глубину стека вызовов?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2018, 09:56
Ответы с готовыми решениями:

Как программно получить список стека вызовов?
Выполняется функция. Я хочу получить список вызовов. Стёк вызовов этой функции....

Как узнать глубину рекурсии?
Подскажите пожалуйста как узнать глубину рекурсии? Нужно узнать глубину...

Переполнение стека вызовов
using System; using System.Collections.Generic; namespace Lists { ///...

Как программно узнать глубину цвета изображения?
как программно узнать глубину цвета Bitmap??

Что это за код вызывается из стека вызовов?
А что это за код, приличный массив кода, который вызывается из стека вызовов?

7
vantfiles
119 / 50 / 24
Регистрация: 07.05.2013
Сообщений: 176
23.03.2018, 16:42 2
C
1
2
3
4
5
6
7
8
9
10
11
local step = 0
 
function recurse()
 
    step = step + 1
    print( step )
    recurse()
 
end
 
recurse()
На моем компе переполнение стека случилось после 65471-й итерации.
1
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
23.03.2018, 17:05 3
Стоит посмотреть на модуль debug.
0
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
23.03.2018, 17:53  [ТС] 4
Спасибо за ответы.
Цитата Сообщение от vantfiles Посмотреть сообщение
переполнение стека
Имелось ввиду глубину стека в конкретный момент в процессе работы скрипта
Цитата Сообщение от NoMasters Посмотреть сообщение
модуль debug
Да, смотрел. К сожалению безрезультатно.
Пользуюсь debug.traceback() при ошибках (печатает весь стек)
Но как узнать глубину так и не понял.
Гугление тоже не помогло(
0
vantfiles
119 / 50 / 24
Регистрация: 07.05.2013
Сообщений: 176
24.03.2018, 09:29 5
Поясните, пожалуйста, для чего это вам нужно.
Может быть вы имеете в виду - как определить количество параметров на стеке при вызове луа-функции?
0
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
24.03.2018, 10:47  [ТС] 6
Хочу сделать лог с отступами, пропорциональными глубине стека. Чтобы вот для такого примера:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function foo()
  log("foo")
  bar()
end
function bar()
  log("bar")
end
function log(str)
  local depth -- получаем глубину стека вызовов
  local indent = string.rep("  ", depth) -- вычисляем отступ
  print(indent .. str)
end
 
log("main")
foo()



получить вот такой вывод:
C++
1
2
3
main
  foo
    bar
Вот эта штука https://www.lua.org/manual/5.3/manual.html#lua_gettop , кажется, должна делать что мне надо.
Но я не знаю как этим пользоваться

в zerobrain
print(lua_gettop) выдает nil
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
24.03.2018, 12:36 7
Лучший ответ Сообщение было отмечено linuxdesk как решение

Решение

Цитата Сообщение от linuxdesk Посмотреть сообщение
print(lua_gettop) выдает nil
ну ещё бы, это же C api, а не функция lua.

Eсли debug.traceback не устраивает, приводить результаты в желаемый вид придётся руками.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function get_stack()
    local i = 1
    return function()
        i = i + 1
        return debug.getinfo(i)
    end
end
 
function foo()
    for frame in get_stack() do
        print(frame.what, frame.name)
    end
end
 
function bar()
    foo()
end
 
bar()
2
linuxdesk
3 / 3 / 2
Регистрация: 25.03.2015
Сообщений: 26
24.03.2018, 15:35  [ТС] 8
NoMasters, благодарю!
C++
1
2
3
4
5
6
7
function get_stack_depth()
  local i = 1
  while debug.getinfo(i) do
    i = i + 1
  end
  return i - 3
end
0
24.03.2018, 15:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2018, 15:35

Как узнать адрес стека FPU
в отладке программы хотелось бы взглянуть на стек fpu, как это сделать? NASM

Как узнать раскладку клавиатуры? Как её изменить? Как узнать, на каком языке текст в файле?
сабж

Как правильно реализовать цепочку вызовов? $o->first()->second();
$o = new Circle(); $o->first()->second(); class Circle{ ... }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru