Выведите stacktraces всех активных Потоков

Для того, чтобы скормить тему и показать возможности быстрого подстрочного индекса, вот небольшая строковая подстрока «substring-toolbox» на основе

Эти методы безопасны и никогда не идут через строковые индексы

extension String {
    // string[i] -> one string char
    subscript(pos: Int) -> String { return String(Array(self)[min(self.length-1,max(0,pos))]) }

    // string[pos,len] -> substring from pos for len chars on the left
    subscript(pos: Int, len: Int) -> String { return self[pos, len, .pos_len, .left2right] }

    // string[pos, len, .right2left] -> substring from pos for len chars on the right
    subscript(pos: Int, len: Int, way: Way) -> String { return self[pos, len, .pos_len, way] }

    // string[range] -> substring form start pos on the left to end pos on the right
    subscript(range: Range<Int>) -> String { return self[range.startIndex, range.endIndex, .start_end, .left2right] }

    // string[range, .right2left] -> substring start pos on the right to end pos on the left
    subscript(range: Range<Int>, way: Way) -> String { return self[range.startIndex, range.endIndex, .start_end, way] }

    var length: Int { return countElements(self) }
    enum Mode { case pos_len, start_end }
    enum Way { case left2right, right2left }
    subscript(var val1: Int, var val2: Int, mode: Mode, way: Way) -> String {
        if mode == .start_end {
            if val1 > val2 { let val=val1 ; val1=val2 ; val2=val }
            val2 = val2-val1
        }
        if way == .left2right {
            val1 = min(self.length-1, max(0,val1))
            val2 = min(self.length-val1, max(1,val2))
        } else {
            let val1_ = val1
            val1 = min(self.length-1, max(0, self.length-val1_-val2 ))
            val2 = max(1, (self.length-1-val1_)-(val1-1) )
        }
        return self.bridgeToObjectiveC().substringWithRange(NSMakeRange(val1, val2))

        //-- Alternative code without bridge --
        //var range: Range<Int> = pos...(pos+len-1)
        //var start = advance(startIndex, range.startIndex)
        //var end = advance(startIndex, range.endIndex)
        //return self.substringWithRange(Range(start: start, end: end))
    }
}


println("0123456789"[3]) // return "3"

println("0123456789"[3,2]) // return "34"

println("0123456789"[3,2,.right2left]) // return "56"

println("0123456789"[5,10,.pos_len,.left2right]) // return "56789"

println("0123456789"[8,120,.pos_len,.right2left]) // return "01"

println("0123456789"[120,120,.pos_len,.left2right]) // return "9"

println("0123456789"[0...4]) // return "01234"

println("0123456789"[0..4]) // return "0123"

println("0123456789"[0...4,.right2left]) // return "56789"

println("0123456789"[4...0,.right2left]) // return "678" << because ??? range can wear endIndex at 0 ???
30
задан scarba05 9 September 2011 в 08:48
поделиться

3 ответа

Единственный недостаток служебного класса - это потеря поддержки конструктора. Это означает, что если вы создаете подкласс элемента управления, когда вы добавляете его в конструктор, любые изменения, внесенные вами в конструктор унаследованного элемента управления, будут отображаться в конструкторе. Более того, если вы хотите добавить к нему некоторые свойства, они будут отображаться в окне свойств, что придаст ему еще большую гибкость. они были разработаны именно для этой цели!

Отправьте сигнал USR1 на ваш сервер Zope, и он немедленно сбросит на консоль трассировку стека для всех потоков. Он будет делать это, даже если все потоки Zope заблокированы.

Под капотом эти пакеты косвенно используют threadframes ; для Python версии 2.5 и выше, когда не с помощью Zope, вы можете создать ту же функциональность, используя функцию sys._current_frames () для доступа к фреймам стека для каждого потока.

Как из Zope 2.12.5 эта функциональность интегрирована в сам Zope, и больше нет необходимости устанавливать дополнительные пакеты.

Под капотом эти пакеты косвенно используют резьбовые рамки ; для Python версии 2.5 и выше, когда не с помощью Zope, вы можете создать ту же функциональность, используя функцию sys._current_frames () для доступа к фреймам стека для каждого потока.

Как из Zope 2.12.5 эта функциональность интегрирована в сам Zope, и больше нет необходимости устанавливать дополнительные пакеты.

Под капотом эти пакеты косвенно используют резьбовые рамки ; для Python версии 2.5 и выше, когда не с помощью Zope, вы можете создать ту же функциональность, используя функцию sys._current_frames () для доступа к фреймам стека для каждого потока.

Как из Zope 2.12.5 эта функциональность интегрирована в сам Zope, и больше нет необходимости устанавливать дополнительные пакеты.

10
ответ дан 27 November 2019 в 23:19
поделиться

2.4. Жаль. Начиная с Python 2.5 есть sys._current_frames () .

Но вы можете попробовать threadframe . И если make-файл вызывает у вас проблемы, вы можете попробовать этот setup.py для threadframe

Пример вывода при использовании threadframe

7
ответ дан 27 November 2019 в 23:19
поделиться

Для ASPN существует подходящий рецепт. Вы можете использовать threading.enumerate () для получения всех tid, а затем просто вызвать _async_raise () с некоторым подходящим исключением для принудительной трассировки стека.

0
ответ дан 27 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: